简介
概念
UIWindow是iOS中用于显示内容、处理触控等功能的基础
重要知识
- 每个app必须要有一个keyWindow才能正常运行,如果是通过代码创建的项目,需要为AppDelegate创建一个window,并调用
makeKeyAndVisible()
来让window显示。当然不要忘了设置window的rootViewController - window通过windowLevel来决定window显示的层级,也就是z轴的值。系统定义了normal, statusBar, alert三个层级,当前这个windowLevel本质是个rawValue为Int的枚举,所以我们可以按需要创建任意层级的level。如在statusBar上,在alert下的层次
常用方法
- 通过设置rootViewController来更换场景。
- 如登录完成后,要进入主页面,此时登录相关的页面可以释放,替换成主页面相关的控制器
- 通过
keyWindow.addSubview()
在最上层的视图上面显示内容。- 如当前控制器可能被嵌入在UINavigationController或者UITabBarController里,上方的导航栏和下面的tabBar被不属于子控制器,而我们想把内容全屏显示。
- 如在网络层或者某些Model层想展示一个toast,此时不方便获取到目前现在显示的视图
- 通过新建一个windowLevel更高的UIWindow,来实现某些内容永远处于最上面。
- 如想实现一个浮动按钮,不会被任何其他内容遮盖。
- 如某些游戏会在进入前台时同步数据,同步时用动画要遮住正常内容,以防用户改时间作弊。
- 全屏的显示或者横屏显示内容
- 通过window的safeInset来确定是不是刘海屏。
延伸
在用 UIApplication.shared.keyWindow 获取keyWindow时,现在会出现一个该属性被废弃的警告。
出现这个警告的原因是,iOS 13 之后,一个app可能有多个scene,也就是说可能有多个keyWindow,所以该属性被废弃。
如果app没有多个scene,使用该方法获取keyWindow是完成没问题的。