UIWindow 原理与巧妙使用 makeKeyAndVisible、makeKeyWindow、becomeKeyWindow、resignKeyWindow.你真的懂了吗?

简介: UIWindow 简介UIWindow 是 UIView 的子类,其在 UIView 添加了一些视图层级,管理视图,转发 UIEvent 对象的属性和 Method。

UIWindow 简介

UIWindow 是 UIView 的子类,其在 UIView 添加了一些视图层级,管理视图,转发 UIEvent 对象的属性和 Method。
其官方定义是这样的: The backdrop for your app’s user interface and the object that dispatches events to your views.

大意就是: 其是应用程序界面的背景,和将事情分配到视图的对象。

  • 程序背景:因为 UIWindow 是应用程序视图层级最顶层的视图, 一般使用一个 rootViewController 管
  • 理着视图. 其还有一项很艰巨的任务, 就是手势,点击等需要传递到最佳响应 subView 的事件, 都是通过 Applicatin -> UIWindow -> subView 分配到真正响应此事件的子视图。

UIWindow 概述

Apple 文档定义:

Windows work with your view controllers to handle events and to perform many other tasks that are fundamental to your app’s operation. UIKit handles most window-related interactions, working with other objects as needed to implement many app behaviors.

大致理解:

UIWindow 与 控制器一起工作, 基本都是设置一个 rootViewController, 来配置一个根控制器, 它能处理大多数响应事件并基本能执行应用程序里面至关重要的任务。监听键盘通知,处理应用程序里面的手势,点击等交互相关事件。 UIKit处理大多数与窗口相关的交互,根据需要与其他对象一起工作以实现许多应用程序行为。这是后面一段话的翻译,没太理解清楚,以免误人子弟,就暂时不写了,理解能力强的指点一下。

通常在一个应用中,只有一个 UIWindow 管理着整个应用程序界面,一般我们通过 Xib 或者 StoreBorad 创建项目时, 都会在 Custom Class 里面的 Class 选项填写上相应的控制器, 这样系统就会自动帮我们制定其为 UIWindow 的根控制器。 否则我们通过纯代码的方式加载的话,都需要手动赋值一个 rooViewController。

我们可以使用 UIWindow 来作什么?

除了上面介绍的使用 UIWindow 来管理视图, 相应应用程序事件外, 系统还为我们推荐了几种使用方法。

  1. 通过设置 不同窗口的属性 windowLevel(默认值是 0,值越高就展示在越前面) 来实现覆盖. 切换窗口等。
  2. 显示window并使其成为键盘事件的目标。
  3. 将坐标值转换为window坐标系。
  4. 更改当前窗口根控制器。
  5. 更改窗口所显示的屏幕。

上面说的几点,可能一下子想象不到具体应用场景,我这里收集了一下分别列举一下:

  • 比如系统弹框, 手势密码, UIAlertView, 电量不足弹框, 等系统级别的弹框, 系统会创建一个 UIWindow 然后通过设置其 windowLevel, 在调用 makeKeyWindow 或 makeKeyAndVisible, 都可以起到直接展示到当前窗口, 为应用程序主窗口的效果。 我们可以 打开 可视化界面 Debug View Hierarchy 观看视图层级 、 我们可以发现 系统创建了 一个 UITextEffectsWindow 、
  • 我们有时候需要跟换 rootViewController, 可以直接通过其 set 方面来进行更换实现。
  • 有时候我们需要监听键盘状态, 可以通过 UIWindow 里面的通知常量来进行监听、以便做出相应执行。

makeKeyAndVisible 与 makeKeyWindow

makeKeyAndVisible : 显示当前窗口,用于显示当前窗口并将其放置在同一级别或更低级别的所有其他窗口的前面。如果只想显示的话,我们还可以通过设置其属性hidden为 NO 即可。
其做了两件事使当前窗口显示出来,并使其成为主要窗口,即可相应应用程序相关事件。
makeKeyWindow: 只做了一件事使当前窗口成为主要窗口。 并不负责将其显示出来。 即时其 windowLevel 值在高都一样。

becomeKeyWindow 与 resignKeyWindow

becomeKeyWindow: 自动调用以通知窗口它已成为关键窗口。 我们不要主动调用此方法, 此方法是系统自动调用的来发通知的.让窗口知道它何时成为主要窗口。此方法的默认实现不执行任何操作,但子类可以覆盖它并使用它来执行与成为关键窗口相关的任务。

resignKeyWindow: 类似becomeKeyWindow, 其是调用以通知窗口它将要注销掉关键窗口的身份.
同样的切勿直接调用此方法。系统调用此方法并发布帖子,让窗口知道它何时不再是键。此方法的默认实现不执行任何操作,但子类可以覆盖它并使用它来执行与重新签名关键窗口状态相关的任务。

参考资料: 官方文档UIWindow

希望此篇文章对您有所帮助,如有不对的地方,希望大家能留言指出纠正。谢谢!!!!!

学习的路上, 与君共勉!!!

目录
相关文章
|
Swift iOS开发 Perl
如何解决Swift混编的module编译错误
前言很多iOS工程都是基于Object-C开发,再逐步向Swift演进,演进过程中不可避免要进行Swift混编。Swift模块需要支持LLVM Module规范,混编工程会遇到各种Module编译错误。这对于不熟悉的同学来说简直是灾难,严重影响开发效率。本文会介绍常见的Module编译错误,希望对大家有所帮助。常见错误1:Could not build module xxx当一个OC模块引用了Sw
8431 1
如何解决Swift混编的module编译错误
|
5月前
|
缓存 运维 并行计算
大模型推理性能翻倍秘籍:计算巢PD分离快速部署指南
阿里云计算巢模型市场提供开箱即用的大语言模型PD分离(Prefill-Decode分离)部署方案,基于ACS集群与专家并行优化,3分钟极速上线Qwen、Deepseek等MoE模型,吞吐提升1.5–2倍,零运维、高可用、企业级监控一应俱全。
|
前端开发 Java 开发工具
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
1783 18
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
本文分享了作者在公司APP海外发布过程中,选择Google FCM进行消息推送的集成经验。文章详细解析了Java集成FCM推送的多种实现方式,包括HTTP请求和SDK集成,并指出了通知栏消息和透传消息的区别与应用场景。同时,作者还探讨了Firebase项目的创建、配置和服务端集成的注意事项,帮助读者解决文档混乱和选择困难的问题。
1245 1
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
583 15
|
Java Spring 容器
@PostConstruct注解学习,最详细的分享教程
@PostConstruct注解学习,最详细的分享教程
728 0
|
存储 编解码 编译器
iOS项目Project 和 Targets配置详解
最近开始学习完整iOS项目的开发流程和思路,在实际的项目开发过程中,我们通常需要对项目代码和资料进行版本控制和管理,一般比较常用的SVN或者Github进行代码版本控制和项目管理。
1274 0
|
缓存 大数据 Android开发
Android 巧用putBinder方法传递大文件
Android 巧用putBinder方法传递大文件
674 0
如何获得keyWindow
如何获得keyWindow
922 0