首页 > 其他分享 >UIWindow的概念与使用

UIWindow的概念与使用

时间:2024-01-31 15:45:49浏览次数:21  
标签:windowScene 一个 testWindow 概念 UIWindow window 使用 keyWindow

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    

标签:windowScene,一个,testWindow,概念,UIWindow,window,使用,keyWindow
From: https://www.cnblogs.com/zhou--fei/p/17999395

相关文章

  • vue3使用v-viewer图片预览工具
    vue3使用v-viewer图片预览v-viewer中文文档安装全局注册main.js文件中使用 v-viewer中文文档安装pnpminstallv-viewerviewerjs 全局注册main.js文件中importViewerfrom'v-viewer'import'viewerjs/dist/viewer.css'constapp=createApp(App)//......
  • 教你使用铁威马NAS安全工具,让数据安心迎新年
    春运已经正式开始啦,大家抢到返乡的车票了吗?春节前除了大扫除,必不可少的还有检查我们的数据安全。每年过年家里总是免不了众多亲朋好友做客,人多虽然热闹但也有不少问题。在使用电脑时被玩闹的小朋友误触丢失数据?借电脑给突然需要在线办公的朋友却担心数据隐私安全问题?没关系,铁威马......
  • js中对数组的unshift是什么操作,为什么使用unshift进行命名?
    在JavaScript中,unshift()是数组对象的一个原生方法,它用于向数组的开头添加一个或多个元素,并将原有的数组元素依次向后移动。这个方法会改变原始数组本身,同时返回新的数组长度。在英语中,“unshift”不是一个标准的单词,但我们可以将其拆解为“un-”和“shift”。其中:“un-”是......
  • 解决win10照片查看器无法使用的问题
    把下面的内容,复制到.Reg的文件中,然后执行此文件。文件内容:WindowsRegistryEditorVersion5.00;ChangeExtension'sFileType[HKEY_CURRENT_USER\Software\Classes\.jpg]@="PhotoViewer.FileAssoc.Tiff";ChangeExtension'sFileType[HKEY_CURRENT_USER\Softwa......
  • Go语言的100个错误使用场景(11-20)|项目组织和数据类型
    目录前言2.Codeandprojectorganization2.11没有使用函数式选项模式(#11)2.12项目缺乏组织(#12)2.13创建公共设施包(#13)2.14忽略包名的冲突(#14)2.15代码文档缺失(#15)2.16不使用code-linter(#16)3.Datatypes3.1八进制产生的混乱局面(#17)3.2忽略整型溢出(#18)3.3不理解浮点数(#19)3......
  • C语言基本结构快和概念
    C语言包含了许多基本构建块和概念,下面是一些主要的部分:基本数据类型:整型(int)、字符型(char)、浮点型(float)、双精度浮点型(double)。派生类型,如数组、指针、结构体、联合体、枚举。运算符:算术运算符(如+,-,*,/)。关系运算符(如==,!=,<,>)。逻辑运算符(如&&,||,!)。位运算符(如&,|,^,......
  • 腾讯云云监控实践:使用云审计 CloudAudit SDK 精准管理腾讯云资源
    一、什么是腾讯云的操作审计CloudAudit来自官方的释义:操作审计CloudAudit是一项支持对您的腾讯云账号进行监管、合规性检查、操作审核和风险审核的服务。借助CloudAudit,您可以记录日志、持续监控并保留与整个腾讯云基础设施中操作相关的账号活动。CloudAudit提供腾讯云账号活......
  • [office] 财务必须熟练使用的15个函数公式,超详细参数详解+举例!
    又到了咱们的Excel技巧课堂分享时刻,一名会计,势必要成为一名表格高手,才能在职场中乘风破浪。不然一个公式参数设置都要10分钟,按时下班怕是不可能,升职加薪更是无望了!今天蛙蛙给大家分享的就是Excel学习逃不开的函数公式,以参数详解+举例的方式,给大家讲讲咱们经常用到的15个公式。一定......
  • 【OpenCV】在Linux上使用OpenCvSharp
    前言OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和MacOS。OpenCvSharp是一个OpenCV的.Netwrapper,应用最新的OpenCV库开发,使用习惯比EmguCV更接近原始的OpenCV,该库采用LGPL发行,对商业......
  • idea 使用三种方式连接到docker damon
    unixsoket默认路径unix:///var/run/docker.sock如果不存在也可以使用unix://~/.docker/run/docker.socktcpsoket该方式必须开始tcp2375端口dockerdamon.jsonmac无效{"hosts":["unix:///var/run/docker.sock","tcp://127.0.0.1:2375"]}单独针......