创建 UIWindow 被忽视的一个坑

开发中经常需要自定义弹窗的需求,一般实现方式无非就是 拿到 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 中删除。

转载于:https://juejin.im/post/5bff8872e51d450c740dd17d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值