相关文章
UIWindow
UIWindow对象提供app界面的背景,和重要的事件响应交互。Windows本身没有任何可视的表现,但它对view的呈现起着关键作用。每一个view显示在屏幕上,其实是附在一个window上,每个window与应用程序中的其他window无关。应用程序收到的事件,最初被转发到相应的window对象上,然后将这些事件转发到相应的view中。Windows与view controller一起工作来实现横竖屏转换,并执行许多其他应用程序操作的基本任务。OverView
Windows是应用程序的一个基本组成部分,但开发者很少通过代码去影响它。UIKit处理大多数window相关的交互,与其他对象完成许多应用程序行为。但是,开发者需要在你的应用程序中做以下操作:● 提供一个主窗口来显示应用程序的内容。
● 创建额外的window显示额外的内容(译者加:常见于视频类APP,横屏播放其实在一个window上进行的)
提供一个主window比较容易,因为xcode已经替你做了。新的iOS工程,用storyboards定义app的view,storyboards需要app的delegate object是window,Xcode模板自动提供。因此,不需要开发者做什么,新工程就已经有一个window来显示view controller的内容了。
大多数APP仅需要一个window即可,你也可以创建额外的window,一般来说额外的window用于显示附加的外部显示器上的内容。
除了为应用程序的内容提供window对象外,你还可以使用窗口对象来处理一些其他任务:
● 设置window的Z轴的水平,从而影响其他window的层级。
● 显示window并使其成为键盘事件的目标。
● 将坐标值转换为window坐标系。
● 更改window的根视图控制器。
● 更改window所显示的屏幕
开发者应极少的继承UIWindow,你可能在window中实现的多种行为,通常可以更容易地在更高级别的view controller中实现。即使派生了UIWindow,需要重载becomeKey()和resignKey()方法,以便在window’s key 状态改变时,相应作出改变。
创建额外的window
除了应用程序的主窗口(其中Xcode通常提供),你负责创建和配置APP的其他Windows。额外window最常用法是在连接的外部显示器上显示内容,但也可以在同一屏幕上显示多个窗口。创建window时,始终设置window的初始size为屏幕的大小。你还要提供根视图控制器。虽然你可以在window上添加子视图,但提供一根视图控制器是一个更好的方式来管理窗口的内容。使用根视图控制器维护窗口对象和应用程序在该窗口中显示的内容之间的分离。
代码1:显示了一个示例的方法,构建了一个视图控制器显示在第二屏幕内容的自定义窗口。该示例假定实现此方法使用externalwindow变量存储window对象。
- (void)configureExternalDisplayAndShowWithContent:(UIViewController*)rootVC
{
// Configure the content only if a second screen is available.
if ([[UIScreen screens] count] > 1) {
UIScreen* externalScreen = [[UIScreen screens] objectAtIndex:1];
CGRect screenBounds = externalScreen.bounds;
// Configure the window
self.externalWindow = [[UIWindow alloc] initWithFrame:screenBounds];
self.externalWindow.windowLevel = UIWindowLevelNormal;
self.externalWindow.screen = externalScreen;
// Install the root view controller
self.externalWindow.rootViewController = rootVC;
// Show the window, but do not make it key.
self.externalWindow.hidden = NO;
}
else {
// No external display available for configuration.
}
}
理解键盘事件
当触摸事件被传递到它们发生的window时,没有相关坐标值的事件传递到键窗口。在同一时间只有一个窗口可以key window,你可以使用一个窗口的keywindow属性判断它是否是keywindow。大多数时候,你的应用程序的主窗口是key window,但UIKit可根据需要指定其他window。想知道那个window被作为key window可以监听下面的通知UIWindowDidBecomeKeyNotification和 UIWindowDidResignKeyNotification。keywindow改变时候,系统作出相应并发送这些通知。强制窗口成为key window,或强制窗口resign key window状态,调用UIWindow的相应方法。