为有牺牲多壮志,敢教日月换新天。

[iOS]UIWindow详解

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(let_us_code)
➤博主域名:https://www.zengqiang.org
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/12190314.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

UIWindowLevel

关于 UIWindowLevel 我想多说几句, UIWindow 在显示的时候会根据 UIWindowLevel 进行排序的,即 Level 高的将排在最前面.默认是 0

open var windowLevel: UIWindowLevel // default = 0.0

系统为我们定义了三个window层级,即:

1 public let UIWindowLevelNormal: UIWindowLevel
2 public let UIWindowLevelAlert: UIWindowLevel
3 public let UIWindowLevelStatusBar: UIWindowLevel

打印输出这三个level的值查看下:

1 STWLog("UIWindowLevelNormal: \(UIWindowLevelNormal)")
2 STWLog("UIWindowLevelStatusBar: \(UIWindowLevelStatusBar)")
3 STWLog("UIWindowLevelAlert: \(UIWindowLevelAlert)")

什么是 keWindow ? 我们来查看下官方文档是怎么描述的:

 
 

 

也就是说在 windows 数组中,最近时间调用了 makeKeyAndVisible 方法的就是 keyWindow了;

总结:

  1. UIWindowLevel 的值不仅仅只有 UIWindowLevelNormalUIWindowLevelAlertUIWindowLevelStatusBar 这三个,可以是自定义的随意值,哪怕是负数
  2. UIWindow 的显示的确可以通过 UIWindowLevel 来区分优先级,所有的window都会被加在界面上,只不过会通过优先级罗列起来,UIWindowLevel 大的在上面显示,UIWindowLevel 小的在下面显示。
  3. UIWindowLevel 优先级相等的情况下,看谁后实例化了,谁后实例化谁先显示
  4. 如果将当前 KeyWindow对象设置为 nil 则该对象会从 Windows数组中移除,并且最后实例化的Window对象将成为 KeyWindow ,但是依然遵循总结2中的描述,UIWindowLevel 大的在上面显示,UIWindowLevel 小的在下面显示。
 
示例代码:
 1 //MARK:添加搜索窗体
 2     func addWindow(_ controller:UIViewController,_ frame: CGRect)
 3     {
 4         //窗体大小位置
 5         self.window = UIWindow(frame: frame)
 6         //窗体绑定的视图控制器
 7         self.window?.rootViewController = controller
 8         //背景色透明
 9         self.window?.backgroundColor = UIColor.clear
10         //判断是否为空
11         if self.window != nil
12         {
13             self.window!.windowLevel = UIWindow.Level.alert + 1
14             //不隐藏
15             self.window!.isHidden = false
16             //显示窗体
17             self.window!.makeKeyAndVisible()
18             //增加对iOS 13的支持代码
19             if #available(iOS 13.0, *)
20             {
21                 if let currentWindowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
22                     self.window!.windowScene = currentWindowScene
23                 }
24             }
25         }
26     }

隐藏窗体属性:

1 //是否隐藏
2 window?.isHidden = show

 

 
posted @ 2020-01-14 09:14  为敢技术  阅读(1232)  评论(0编辑  收藏  举报