UIWindow的作用
UIWindow是UIView的子类用于显示程序内容。每一个UIView想要将内容显示到屏幕上都需要依赖于一个UIWindow。
iOS应用程序要想正常运行至少要有一个UIWindow存在,通常这个UIWindow也就是应用程序的主窗口keyWindow。
APP中可以同时出现多个UIWindow,并且多个UIWindow之间是相互独立的。它们可以同时出现,但只能有一个作为keyWindow用来接收输入事件,如文字输入。
APP的事件传递链为:应用程序收到事件之后会先转发给keyWindow对象,然后keyWindow再将事件按照View的树形结构递归转发给view对象。
KeyWindow的作用
keyWindow是应用程序的关键Window,用来接收键盘以及非触摸类的消息事件。虽然APP可能同时有多个UIWindow存在,但是程序中同一时刻只能有一个UIWindow是keyWindow。
这个也是是最后一个调用makeKeyAndVisible方法的UIWindow。
UIWindowScene 和 UIScene
UIScene表示应用程序中的一个场景的对象。一个场景通常对应于应用程序的一个界面或窗口,例如 iPad 上的分屏应用(一个APP,多场景)、iPhone 上的单个界面(一个APP,一个场景)。
每个 UIScene 可能包含一个或多个窗口 (UIWindow) 以及与之相关联的视图层次结构。
UIWindowScene 是 UIScene 的一个特殊子类,表示应用程序中的一个窗口场景。每个窗口场景都关联一个或多个窗口,而每个窗口包含了应用程序的用户界面。
所以在iOS中,每个UIWindow都要设置对应的UIWindowScene场景,当APP中同时出现多个UIWindow时,它们指向同一个正在活动的UIWindowScene场景。
makeKeyWindow与makeKeyAndVisible的区别
当新建一个UIWindow时,它的hideen属性默认是YES的,既默认是不显示的。
makeKeyWindow方法是将一个window设置为keyWindow,如果window没有变成keyWindow,则其内部的文本输入框是没法输入文字的,既无法接收输入事件。
makeKeyAndVisible方法会将一个window设置为keyWindow,并且将其hideen设置为NO,显示出来。
makeKeyAndVisible之后,系统对window做的事情如下:
1.将UIApplication对象的keyWindow设置为当前这个window
2.当前window的hidden设置为NO,同时该window的keyWindow属性变为YES
UIWindow的主要属性
@property(nonatomic,strong) UIScreen *screen

一个UIScreen对象对应一个实际设备的物理屏幕,该属性默认为[UIScreen mainScreen]。一个iPhone默认一个屏幕,而一个屏幕可以存在多个window,这也是APP中可以同时存在多个window的原因。

@property(nullable, nonatomic,strong) UIViewController *rootViewController;

该属性为window的根控制器,这个属性是不能为空的,必须进行赋值

@property(nullable, nonatomic, weak) UIWindowScene *windowScene API_AVAILABLE(ios(13.0)

ios13以上必须设置windowScene属性,否则window不显示

- (CGPoint)convertPoint:(CGPoint)point toWindow:(nullable UIWindow *)window;
- (CGPoint)convertPoint:(CGPoint)point fromWindow:(nullable UIWindow *)window;
- (CGRect)convertRect:(CGRect)rect toWindow:(nullable UIWindow *)window;
- (CGRect)convertRect:(CGRect)rect fromWindow:(nullable UIWindow *)window;

window之间是相互独立的,如果想要将两个window的坐标相互映射的时候,就需要用到以上几个方法。

UIWindow的创建步骤
1.创建一个window对象,并用一个对象强持有它
2.创建一个控制器,赋值为window的根控制器
3.设置当前活动的windowScene对象
4.显示窗口
//1. 创建一个window对象,并用一个对象强持有它
//UIWindow的大小是通过frame自定义设置的,frame决定了这个窗口大小
UIWindow *testWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
testWindow.windowLevel = UIWindowLevelStatusBar;
self.testWindow = testWindow;
//2. 创建一个控制器,赋值为window的根控制器
UIViewController *controller = [[UIViewController alloc] init];
testWindow.rootViewController = controller;
//3.设置当前活动的windowScene对象
for (UIWindowScene *windowScene in [UIApplication sharedApplication].connectedScenes) {
if (windowScene.activationState == UISceneActivationStateForegroundActive) {
self.alertWindow.windowScene = windowScene;
break;
}
}
//4. 显示窗口
[testWindow makeKeyAndVisible];
系统window等级
UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; 0
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert; 2000
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar; 4000
如何销毁一个 UIWindow
将window的hidden属性置为YES
将持有该window的那个对象对window的持有去掉
self.testWindow.hidden = YES;
self.testWindow = nil;
参考文章:
https://www.jianshu.com/p/98cd7fc4bfba
 
 

UIWindow的概念与使用的更多相关文章

  1. 浅谈 JavaScriptCore

    来源:XcodeMen(王瑞华) 链接:http://t.cn/RVqQI5p 本文由我们团队的王瑞华童鞋撰写. OS X Mavericks 和 iOS 7 引入了 JavaScriptCore 库 ...

  2. UIScreen(屏幕)、UIWindow(画框)、UIView(画布)、didFinishLaunchingWithOptions的概念

    //didFinishLaunchingWithOptions 方法:顾名思义.在app开始运行时会调用里面的方法.- (BOOL)application:(UIApplication *)appli ...

  3. iOS中什么是superView?(新手概念简述版)

    文/司马陶冶(简书作者)/文章有删改原文链接:http://www.jianshu.com/p/8537dac37852 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在iPhone ...

  4. iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

    UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...

  5. IOS开发涉及有点概念&相关知识点

    前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...

  6. [iOS基础控件 - 6.10.7] UIWindow

    A.UIWindow概念 1.继承UIView,是一种特殊的UIView 2.通常一个APP只有一个UIWindow 3.iOS程序启动后,创建的第一个视图就是UIWindow 4.没有UIWindo ...

  7. iphone绘图的几个基本概念CGPoint、CGSize、CGRect、CGRectMake、window(窗口)、视图(view)

    我一般情况下不会使用interface builder去画界面,而是用纯代码去创建界面,不是装B,而是刚从vi转到xcode不久,不太习惯interface builder而已.当然如果需要我也会使用 ...

  8. UIApplication,UIWindow,UIViewController,UIView(layer)

    转载自:http://www.cnblogs.com/iCocos/p/4684749.html UIApplication,UIWindow,UIViewController,UIView(laye ...

  9. IOS开发之XCode学习007:UIWindow对象

    此文学习来源为:http://study.163.com/course/introduction/1002858003.htm #import "AppDelegate.h" @i ...

  10. UIViewController的基本概念与生命周期

    UIViewController是iOS顶层视图的载体及控制器,用户与程序界面的交互都是由UIViewController来控制的,UIViewController管理UIView的生命周期及资源的加 ...

随机推荐

  1. 2017年第八届 蓝桥杯B组C/C++决赛题目

    部分题目示意图来自网络,所以会带水印 最后编辑时间: 2021年5月12日 统一声明 如果不写默认带有常用头文件 如果不表明主函数默认表示在 void solve(){} 默认使用 using nam ...

  2. 如何让 Llama2、通义千问开源大语言模型快速跑在函数计算上?

    本文是"在Serverless平台上构建AIGC应用"系列文章的第一篇文章. 前言 随着ChatGPT 以及 Stable Diffusion,Midjourney 这些新生代 A ...

  3. mysql 使用 trim去不掉空格 解决

    使用mysql8.0时 发现 有几个空字符串怎么也过滤不掉,使用 is not null.trim()<>''.length()>=1都不行,最后查了一些资料说 trim只能去除半角 ...

  4. 十、docker镜像的分层

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...

  5. SpringBoot 动态数据源

    SpringBoot 实现动态数据源切换 Spring Boot + Mybatis Plus + Druid + MySQL 实现动态数据源切换及动态 SQL 语句执行. 项目默认加载 applic ...

  6. CMake学习,我们怎么从零开始狂写大型项目

    CMake 说明 cmake的定义是什么 ?-----高级编译配置工具 当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了-----C ...

  7. Python实现PowerPoint(PPT/PPTX)到PDF的批量转换

    如果需要处理大量的PPT转PDF的工作,一个个打开并另存为PDF是非常费时的做法.我们可以利用Python编程语言的强大的工具来自动化这个过程,使得批量转换变得简单而高效.本文将介绍如何使用Pytho ...

  8. java进阶(32)--Collections工具类

    一.简介:Collection与Collections区别 1.Java.until.Collection是集合接口 2.Java.until.Collections是集合工具类,方便集合的操作 二. ...

  9. Docker-02应用部署案例

    1.Docker部署mysql 拉取mysql镜像 # 查询mysql镜像 docker search mysql # 拉取镜像命令 docker pull centos/mysql-57-cento ...

  10. [转帖]《Linux性能优化实战》笔记(十五)—— 磁盘IO的工作原理

    前一篇介绍了文件系统的工作原理,这一篇来看看磁盘IO的工作原理 一. 磁盘 1. 按存储介质分类 磁盘是可以持久化存储的设备,根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态磁盘. 机械磁盘, ...