建立 UIWindow 被忽视的一个坑

开发中常常须要自定义弹窗的需求,通常实现方式无非就是 拿到 APPDelegate 的 window,将咱们本身的 弹窗 view add进去。其实参照系统的 UIAlert 和 UIActionSheet,还能够本身建立 UIWindow,而后调整这个 window 的 window level来控制层级, 去显示这个 windowwindows

这时候就发现了一个巨坑。数组

建立 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

相关文章
相关标签/搜索