1. 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上。

  2. UIScreen和UIWindow的关系

    • 一个UIWindow必须有一个UIScreen,否者这个屏幕就是黑色的。
    • 一个UIScreen可以有多个UIWindow。一个app只能有一个keywindow
  3. 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的生命周期

        1. 成为keywindow
          发送UIWindowDidBecomeKey通知,调用becomeKey()方法
        2. 变得可见
          发送UIWindowDidBecomeVisible方法。
        3. 变得不可见
          发送UIWindowDidBecomeHidden方法
      • 放弃成为keywindow
        发送UIWindowDidResignKey通知,调用resignKey()方法

  1. 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
    • nativeScalescale
      无论是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
  2. 相关参考资料

UIScreen和UIWindow的更多相关文章

  1. UIScreen UIWindow UIView

    UIScreen(屏幕),UIWindow(窗口),UIView(视图)是IOS的几个基本界面元素.其中UIWindow(窗口)和UIView(视图)是为iPhone应用程序构造用户界面的可视组件.U ...

  2. UIScreen, UIWindow

    模仿书上或网上的例子,每次最开始就是 在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: ...

  3. UIWindow详解

    UIScreen(屏幕),UIWindow(窗口),UIView(视图)是iOS的几个基本界面元素.其中UIWindow(窗口)和UIView(视图)是为iPhone应用程序构造用户界面的可视组件.U ...

  4. iOS.UI.UIWindow

    UIWindow 1. UIWindow 2. UIWindow的使用场景 2.1 额外添加的Window需要手动进行旋转 最近有遇到一个UIWindow的使用场景:在ApplicationDeleg ...

  5. ios应用程序结构

    MVC开发模式 什么是mvc,相信有一定开发经验的程序员都应该知道. M —— 模型,为程序提供数据 V —— 视图,为用户提供界面 C —— 控制器,用来控制程序视图,即上面的V 在ios程序中,一 ...

  6. iOS界面开发

    [转载] iOS界面开发 发布于:2014-07-29 11:49阅读数:13399 iOS 8 和 OS X 10.10 中一个被强调了多次的主题就是大一统,Apple 希望通过 Hand-off ...

  7. 【IOS笔记】Using View Controllers in Your App

    参考:http://www.cnblogs.com/patientAndPersist/p/3279645.html Using View Controllers in Your App Whethe ...

  8. 转--object-C 与lua使用wax交互

    [51CTO独家译文]2011年6月的编程语言排行榜Lua语言一军突起,一举进入前十名.这与一年前苹果决定在iOS系统上使用Lua语言密不可分.但是,你了解如何用Lua语言在iOS上开发应用吗?51C ...

  9. Xcode 6 AutoLayout Size Classes

    1.基本概念 在iPad和iPhone 5出现之前,iOS设备就唯独一种尺寸. 我们在做屏幕适配时须要考虑的唯独设备方向而已. 而非常多应用并不支持转向,这种话就全然没有屏幕适配的工作了. 随着iPa ...

随机推荐

  1. 小程序动态生成二维码,生成image图片

    前端: <image src="{{img_usrl}}" style="width:100%;height:104px;" bindlongtap=&q ...

  2. Qt + OpenSenceGraph(osg) 加载OSG模型

  3. zabbix自定义key监控nginx和fpm(网站并发数)

    一. nginx编译参数 监控nginx,主要讲解监控并发数 --prefix=/usr/local/nginx --with-http_stub_status_module zabbix编译参数的查 ...

  4. 解决VirtualBox 上的XP 关机时重启 , 启动时蓝屏 ,点击电源选项蓝屏

    三个问题一次性解决. 启动时的蓝屏显示错误信息是: STOP 0x000000CE (...) DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATION ...

  5. 一张图5分钟熟悉MarkDown的基本语法

    看到zealer上面有介绍MarkDown的,以前在老罗的发布会也听说过,说锤子便签支持MarkDown,但是不知道有什么用,现在来看看,确实不错. MarkDown的好处是让你可以专注于写字本身,而 ...

  6. Java泛型中的通配符

    Java泛型中的通配符可以直接定义泛型类型的参数.而不用把该函数定义成泛型函数. public class GenericsTest { public static void main(String[ ...

  7. 转载 MYSQL性能优化的最佳20+条经验

    转自:https://coolshell.cn/articles/1846.html 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才 ...

  8. code1052 地鼠游戏

    贪心算法,从后往前 来自codevs的题解: 我的纠结思考过程:如果每一秒都没有重复的地鼠出现 那么肯定是一个一个挨着打如果有重复的地鼠 那么要考虑打那个更优 当然是选分值最大的 单纯这样想很合理 但 ...

  9. Cw210开发板

    达内培训嵌入式开发板 qt + kernel uboot toolchain

  10. [SoapUI] 通过Groovy写文本文件

    如果文件已经存在,先删除,然后向文件中追加失败信息 if(maxRecordFail>0){ def testResultFile = new File(projectDir+"\\T ...