开发中常常须要自定义弹窗的需求,通常实现方式无非就是 拿到 APPDelegate 的 window,将咱们本身的 弹窗 view add进去。其实参照系统的 UIAlert 和 UIActionSheet,还能够本身建立 UIWindow
,而后调整这个 window 的 window level
来控制层级, 去显示这个 window
。windows
这时候就发现了一个巨坑。数组
建立 window 的方法就是 初始化就好:bash
let window = UIWindow(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight))
复制代码
可是读取当前已经显示的 window 的时候发现一个问题ui
let topWindow = UIApplication.shared.windows.last
复制代码
UIApplication.shared.windows
数组的个数竟然不是当前以显示的个数,而是前面已经建立 Window 的个数,例如:spa
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
的结果就是:code
▿ 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
中删除。element