開發中經常需要自定義彈窗的需求,一般實現方式無非就是 拿到 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
中刪除。