UIScreen和UIWindow
UIScreen 和UIWindow
UIScreen object defines the properties associated with a hardware-based display
就是说UIScreen是硬件显示器的软件表示。通过UIScreen来获取和设置对应显示器的属性。一个设备可以有一个主屏幕和若干附属屏幕(attached screens)。
A UIWindow object provides the backdrop for your app’s user interface and provides important event-handling behaviors
UIWindow是用户界面的载体,用户的输入首先被对应的UIWindow接收,然后被转发到其他的view上。
UIScreen和UIWindow的关系
- 一个UIWindow必须有一个UIScreen,否者这个屏幕就是黑色的。
- 一个UIScreen可以有多个UIWindow。一个app只能有一个keywindow
UIWindow
- windowLevel
UIWindow分布在z轴的不同位置。前面的UIWindow会遮住后面的UIWindow。如果同一个level有多个UIWindow,这些window之间的顺序是不确定的。
系统定义的windowlevel- UIWindowLevelNormal
- UIWindowLevelStatusBar
- UIWindowLevelAlert
rootViewController: UIViewController
每一个window必须设置rootviewcontroller。这个rootviewcontroller的view就是window要显示的内容。screen: UIScreen
这个window要在哪个屏幕上展示。一个window只能在一个屏幕上展示。keywindow
A window is considered the key window when it is currently receiving keyboard and non touch-related events.
就是说如果一个window可以接收键盘和非触摸事件,那么这个就叫做keywindow。
事件响应流是这样的。
- 如果一个触摸了屏幕,那么这个事件会被分配到响应的UIWindow上,然后由UIWindow来做事件分发。
- 如果一个事件没有对应的坐标呢,就被keywindow来做响应的分发和处理。
- 如何判断一个window是不是keywindow?
isKeyWindow: Bool { get }
如何把一个window变成keywindow
调用
makeKeyAndVisible()方法
调用这个方法会把这个window变成keywindow,并在同级别的level中在最前面展示。因此,keywindow不一定显示在最前面,可能在z轴方向上有一个window在keywindow上面。
若想把一个window变成可见的,只需要设置hidden属性为no就好了。// Show the window, but do not make it key
self.externalWindow!.hidden = false
调用
makeKey()方法。
这个方法不改变window的可见性。keywindow的生命周期
- 成为keywindow
发送UIWindowDidBecomeKey通知,调用becomeKey()方法 - 变得可见
发送UIWindowDidBecomeVisible方法。 - 变得不可见
发送UIWindowDidBecomeHidden方法
- 成为keywindow
放弃成为keywindow
发送UIWindowDidResignKey通知,调用resignKey()方法
- windowLevel
UIScreen
- 获取主屏幕
class func main() -> UIScreen - 获取所有屏幕
class func screens() -> [UIScreen]。mainScreen永远是第一个。 获取屏幕分辨率
var bounds: CGRect { get }。
考虑到了屏幕的旋转,point表示。var nativeBounds: CGRect { get }。
以像素衡量的分辨率,不考虑旋转。- 获取屏幕的point衡量的分辨率。
UIScreen.mainScreen().fixedCoordinateSpace.bounds - 另一种获取考虑屏幕旋转的point表示的分辨率的方法
UIScreen.mainScreen().coordinateSpace.bounds
nativeScale和scale
无论是CoreGraphics还是图片scale选取,都应该以[UIScreen scale]为准。设置屏幕的亮度
var brightness: CGFloat { get set }。范围是0到1,1最亮。下次锁屏之前一直有效。如果锁屏然后解锁,恢复到系统亮度。屏幕刷新时的回调
let ca1 = UIScreen.mainScreen().displayLinkWithTarget(self, selector: #selector(ViewController.testCADisplay))
ca1?.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
相关通知
- 有屏幕连接
UIScreenDidConnect - 有屏幕断开连接
UIScreenDidDisconnect - 屏幕分辨率变化
UIScreenModeDidChange - 屏幕亮度变化
UIScreenBrightnessDidChange
- 有屏幕连接
- 获取主屏幕
相关参考资料
UIScreen和UIWindow的更多相关文章
- UIScreen UIWindow UIView
UIScreen(屏幕),UIWindow(窗口),UIView(视图)是IOS的几个基本界面元素.其中UIWindow(窗口)和UIView(视图)是为iPhone应用程序构造用户界面的可视组件.U ...
- UIScreen, UIWindow
模仿书上或网上的例子,每次最开始就是 在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: ...
- UIWindow详解
UIScreen(屏幕),UIWindow(窗口),UIView(视图)是iOS的几个基本界面元素.其中UIWindow(窗口)和UIView(视图)是为iPhone应用程序构造用户界面的可视组件.U ...
- iOS.UI.UIWindow
UIWindow 1. UIWindow 2. UIWindow的使用场景 2.1 额外添加的Window需要手动进行旋转 最近有遇到一个UIWindow的使用场景:在ApplicationDeleg ...
- ios应用程序结构
MVC开发模式 什么是mvc,相信有一定开发经验的程序员都应该知道. M —— 模型,为程序提供数据 V —— 视图,为用户提供界面 C —— 控制器,用来控制程序视图,即上面的V 在ios程序中,一 ...
- iOS界面开发
[转载] iOS界面开发 发布于:2014-07-29 11:49阅读数:13399 iOS 8 和 OS X 10.10 中一个被强调了多次的主题就是大一统,Apple 希望通过 Hand-off ...
- 【IOS笔记】Using View Controllers in Your App
参考:http://www.cnblogs.com/patientAndPersist/p/3279645.html Using View Controllers in Your App Whethe ...
- 转--object-C 与lua使用wax交互
[51CTO独家译文]2011年6月的编程语言排行榜Lua语言一军突起,一举进入前十名.这与一年前苹果决定在iOS系统上使用Lua语言密不可分.但是,你了解如何用Lua语言在iOS上开发应用吗?51C ...
- Xcode 6 AutoLayout Size Classes
1.基本概念 在iPad和iPhone 5出现之前,iOS设备就唯独一种尺寸. 我们在做屏幕适配时须要考虑的唯独设备方向而已. 而非常多应用并不支持转向,这种话就全然没有屏幕适配的工作了. 随着iPa ...
随机推荐
- 【Unity】关于U3d与bip骨骼适配
http://blog.csdn.net/kiki110120/article/details/50371662 写在2015/12/21 1.Generic 在拿到美术FBX文件后,导入u3d,默认 ...
- copy&mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)
写在前面 其实看了这么多,总结一个结论: 拷贝的初衷的目的就是为了:修改原来的对象不能影响到拷贝出来得对象 && 修改拷贝出来的对象也不能影响到原来的对象 所以,如果原来对象就是imm ...
- 用map函数来完成Python并行任务的简单示例
众所周知,Python的并行处理能力很不理想.我认为如果不考虑线程和GIL的标准参数(它们大多是合法的),其原因不是因为技术不到位,而是我们的使用方法不恰当.大多数关于Python线程和多进程的教材虽 ...
- Opencv读取图片像素值
#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...
- sqlserver计算日期
在网上找到的一篇文章,相当不错哦O(∩_∩)O~ 这是计算一个月第一天的SQL 脚本: SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) --当月的第一 ...
- EZOJ #226
传送门 分析 我们可以建一个k层图,把dp转移的三维对应到每个点上,每个第k层点连向0层点 我们让第0层点为实点其余为虚点,只要碰到虚点就dfs到他连得所有实点再将实点入队即可 代码 #include ...
- 1、设备网络SDK主要功能
图像预览.文件回放和下载,云台控制,布防/撤防,语音对讲,日志管理,解码卡,远程升级,远程重启/关闭,格式化硬盘,参数配置(系统配置,通道配置,串口配置,报警配置,用户配置),多路解码器,智能设备功能 ...
- python CSV 文件的读写
1.CSV文件 import csv with open(r"E:\code\0_DataSet\tianchi_2015_mobile_recommand\fresh_comp_offli ...
- mysql 事物ACID和隔离级别
⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则 ...
- [GO]runtime包及gosched的使用
Gosched:让出CPU时间片 Goexit:退出当前的协程 GOMAXPROCS:设置使用最大的CPU数量(哇,牛逼了...) package main import ( "fmt&qu ...