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. POJ 2484博弈——对称法

    题目链接:http://poj.org/problem?id=2484 题意:Alice和Bob玩游戏,从一堆圆环形排列的硬币中拿硬币,每次可以拿一个或者两个,但必须拿连续的(两个中间有空位也视为不连 ...

  2. P3574 [POI2014]FAR-FarmCraft (树形DP)

    这题直接贪心显然不可行. 考虑树形dp,用 \(f_i\) 表示到 \(i\) 人后,以 \(i\) 为根的所有人安装完的最短时间. 对于一个节点 \(u\), 假设拜访子节点的顺序为 \(v_1,v ...

  3. Codeforce1343C. Alternating Subsequence

    Recall that the sequence b is a a subsequence of the sequence a if b can be derived from a by removi ...

  4. <vue 基础知识 3、v-bind使用>

    代码结构 一.     v-bind基本使用 1.效果 2.代码 01-v-bind基本使用.html <!DOCTYPE html> <html lang="en&quo ...

  5. localstorage、sessionstorage 存储布尔值要注意

    今天实现一个功能,点击首页,头部按钮,切换大屏功能.不同的屏,页头宽度不一样,小屏1280px,  大屏百分百屏幕,左右留点120px的padding值. 思路:点击按钮,切换不同的子路由,顶部通过一 ...

  6. 使用 Sealos 将 ChatGLM3 接入 FastGPT,打造完全私有化 AI 客服

    FastGPT 是一款专为客服问答场景而定制的开箱即用的 AI 知识库问答系统.该系统具备可视化工作流功能,允许用户灵活地设计复杂的问答流程,几乎能满足各种客服需求. 在国内市场环境下,离线部署对于企 ...

  7. Go 标准库 net

    本篇文章主要介绍 Go 标准库中的 net 包,通过一个小例子介绍常用的 net 包函数/方法 Listen,Accept 和 Dial 等. 1. net 简介 Go 官网对 net 包的定义如下: ...

  8. React报错之Property does not exist on type 'JSX.IntrinsicElements'

    正文从这开始~ 总览 当组件名称以小写字母开头时,会导致"Property does not exist on type 'JSX.IntrinsicElements'"错误.为了 ...

  9. printf 函数格式控制

    Printf()介绍 printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出.标准输出,即标准输出文件,对应终端的屏幕.printf()申明于头文件stdio.h. 函数原型: in ...

  10. Chrome显示和更改显示网页字符集的方法

    Chrome显示和更改显示网页字符集的方法 背景 前段时间学习和总结了unicode和utf8的一些知识. 当时想到应该学习和整理一下网站网页的编码格式字符集相关的内容 想着既然给自己立了flag, ...