UIWindow 中的 UIScreen 属性有啥用?

Posted

技术标签:

【中文标题】UIWindow 中的 UIScreen 属性有啥用?【英文标题】:What is the use of UIScreen property in UIWindow?UIWindow 中的 UIScreen 属性有什么用? 【发布时间】:2015-02-03 07:15:39 【问题描述】:

我在查看 UIWindow 类引用,在那里我找到了默认为 [UIScreen mainScreen]UIScreen 属性

@property(nonatomic,retain) UIScreen *screen NS_AVAILABLE_ios(3_2);  
// default is [UIScreen mainScreen]. changing the screen may be an expensive operation and should not be done in performance-sensitive code

我们用AppDelegate中的UIScreen初始化UIWindow对象

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]

我想知道为什么我们需要UIWindow 中的UIScreen 属性

【问题讨论】:

【参考方案1】:

UIScreen 指的是设备框架。

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScreen_Class/index.html

您可以获取设备尺寸以查找设备 iPhone 4、iPhone 5、iPhone 6、iPhone 6+ 和 iPad

[[UIScreen mainScreen] bounds] //给你设备的大小。

您可以根据上述尺寸区分设备。

[[UIScreen mainScreen] bounds].size.width //给出设备的宽度 [[UIScreen mainScreen] bounds].size.height) //给出设备的高度。

或者你可以这样使用

CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];

希望对你有帮助...

【讨论】:

【参考方案2】:

默认情况下,所有窗口都在主设备屏幕上创建。如果设备附加了其他屏幕,则将不同的屏幕对象分配给此属性会导致窗口显示在新屏幕上。

根据 Apple 文档:

在屏幕之间移动窗口是一项相对昂贵的操作,不应该在性能敏感的代码中完成。相反,建议您在第一次显示窗口之前更改屏幕。更改尚未订购到屏幕上的窗口的屏幕不会产生显着的额外成本。

【讨论】:

【参考方案3】:

来自IOS开发者Library

self.window 假定为您的应用程序委托的声明属性,该属性配置为保留窗口对象。如果您正在为外部显示器创建一个窗口,则将其分配给不同的变量,并且您需要指定表示该显示器的非主 UIScreen 对象的边界。

创建窗口时,您应该始终将窗口的大小设置为屏幕的完整边界。您不应缩小窗口大小以容纳状态栏或任何其他项目。无论如何,状态栏始终浮动在窗口顶部,因此您应该缩小以适应状态栏的唯一内容是您放入窗口的视图。如果你使用视图控制器,视图控制器应该自动处理视图的大小。

【讨论】:

【参考方案4】:

UIScreen 对象定义与基于硬件的显示相关的属性。 iOS 设备有一个主屏幕和零个或多个附加屏幕。使用此类为连接到设备的每个显示器获取屏幕对象。每个屏幕对象定义相关显示的边界矩形和其他有趣的属性,例如亮度。更多请参考docs

【讨论】:

【参考方案5】:

您的应用程序只有一个 UIWindow 用于所有其他视图的绘制。申请时 开始UIWindow 覆盖整个屏幕空间。这就是您实例化的原因 UIWindow 您必须将其帧大小设置为主屏幕边界大小。

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds];

UIScreen在这里的作用是什么?

UIScreen 表示设备屏幕的矩形。你的 UIScreen 更了解 您的设备屏幕属性,例如分辨率、像素纵横比、亮度、亮度。

另一方面,UIWindow 管理您的视图层次结构并帮助视图在屏幕上显示内容。 UIWindow 在初始化期间从UIScreen 绑定属性中获取它的框架并对其进行自我初始化,以便它可以从设备屏幕获得最大景观以将其提供给子视图。一旦初始化完成UIWindow 框架包括状态栏、绘图区和底部栏。

【讨论】:

以上是关于UIWindow 中的 UIScreen 属性有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

UIWindow ,UIlable

你真的了解UIWindow吗?

iOS8+ UIScreen 上的 -nativeScale 和 -scale 有啥区别?

UIWindow 子类:Touches 事件不会被触发

为通用视图修改 UIWindow

给 UIWindow 添加 subview 有啥坏处?