建立 UIWindow 被忽視的一個坑

yang152412發表於2018-12-07

開發中經常需要自定義彈窗的需求,一般實現方式無非就是 拿到 APPDelegate 的 window,將我們自己的 彈窗 view add進去。其實參照系統的 UIAlert 和 UIActionSheet,還可以自己建立 UIWindow,然後調整這個 window 的 window level來控制層級, 去顯示這個 window

這時候就發現了一個巨坑。

建立 window 的方法就是 初始化就好:

let window = UIWindow(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight))
複製程式碼

但是讀取當前已經顯示的 window 的時候發現一個問題

let topWindow = UIApplication.shared.windows.last
複製程式碼

UIApplication.shared.windows 陣列的個數居然不是當前以顯示的個數,而是前面已經建立 Window 的個數,例如:

let w1 = UIWindow(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight))
let w2 = UIWindow(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight))
let w3 = UIWindow(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight))
複製程式碼

這樣連續建立多個 window。那麼列印出來的 UIApplication.shared.windows的結果就是:

▿ 5 elements
  - 0 : <PaintingWindow: 0x11be07d80; baseClass = UIWindow; frame = (0 0; 375 812); gestureRecognizers = <NSArray: 0x280bb0360>; layer = <UIWindowLayer: 0x28057d6a0>>
  - 1 : <UIWindow: 0x11d806d40; frame = (0 0; 375 812); hidden = YES; gestureRecognizers = <NSArray: 0x280bb74e0>; layer = <UIWindowLayer: 0x280555f20>>
  - 2 : <UIWindow: 0x11dc0bc40; frame = (0 0; 375 812); hidden = YES; gestureRecognizers = <NSArray: 0x280bf0e70>; layer = <UIWindowLayer: 0x2805551e0>>
  - 3 : <UIWindow: 0x11d903590; frame = (0 0; 375 812); hidden = YES; gestureRecognizers = <NSArray: 0x280bf27c0>; layer = <UIWindowLayer: 0x28051f0a0>>
  - 4 : <UIWindow: 0x11d901790; frame = (0 0; 375 812); hidden = YES; gestureRecognizers = <NSArray: 0x280bf29a0>; layer = <UIWindowLayer: 0x28051f1e0>>
複製程式碼

原來只要初始化了 window,那麼就自動給加入到了UIApplication.shared.windows 中了,在釋放 window 之後,window 會自動從 UIApplication.shared.windows 中刪除。

相關文章