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. [Docker] Mac M2 – no such file or directory: /var/lib/docker/volumes ,找不到var/lib/docker/volumes (已解決)

    Mac M2 Pro Docker 24.0.6 $ docker volume inspect 14dfdb65fb7075d91b2004c979a3591df54bcc1303ff3ca96a3 ...

  2. 【计算机网络】WebSocket 是什么原理?为什么可以实现持久连接?

    一.WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接),循环连接的不算) 首先HTTP有1.1和1.0之说,也就是所谓的 ...

  3. ZOJ 3537 Cake (凸包 + 区间DP && 最优三角形剖分)

    题目链接:Here 题意: 给定 \(n\)​​ 个点的坐标,先问这些点能否组成一个凸包,如是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据 \(cost_{i, j} = |x_i + ...

  4. 项目2 可视化数据(第17章 使用API)

    17.1 使用Web API Web API是网站的一部分,用于与使用非常具体的URL请求特定信息的程序交互.这种请求称为API调用.请求的数据将以易于处理的格式(如JSON或CSV)返回. 17.1 ...

  5. 5G“乍到”,图扑带你了解室内定位可视化的实现与新突破

    前言 现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的  ...

  6. 如何用 7 分钟击破 Serverless 落地难点?

    当前,Serverless 覆盖的技术场景正在不断变广.Serverless 已在微服务.在线应用.事件驱动.任务处理等众多场景被验证且广泛应用 .当你想要部署一个网站时,需要自己购买服务器并花费时间 ...

  7. 在mounted 中发生异步和同步共存的问题

    https://www.cnblogs.com/ifon/p/12391923.html

  8. 简单实现el-dialog的拖拽功能

    首先还是要明确几个概念,这里通过修改css并截图给大家介绍下,理解了这几个概念,代码写起来会得心应手许多. clientWidth,clientHeight scrollWidth,scrollHei ...

  9. AI毕业设计生成器(基于AI大模型技术开发)

    这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码.它基于几百个github上面开源的java和python项目,运用tengsorflow技术,训练出了AI大模型.基本实现了计算机毕业 ...

  10. SV概述

    System Verilog概述 路科验证视频,B站可看(补充一下知识) 学习SV之前,最好有Verilog基础 SV诞生 SV发展历史 Verilog - 偏向于设计 System Verilog ...