UIWindow对象为你的app的用户界面提供背景并且提供重要的事件处理行为。
Windows本身没有任何明显的外观,但是它们对显示你的app的视图是至关重要的。
每一个出现在屏幕上的视图都依附在Window上,而且app上的每一个Window都是相互独立的。
你的app的事件首先沿着适当的Window对象,进而将这些事件转发到适当的视图。
Windows对视图控制器实现取向变化和执行其他任务,对应用程序的操作是至关重要的。
概述
Windows对你的app是至关重要的,但是你在代码上似乎跟它们并不深入。
UIKit处理了大多数与Windows相关的行为,和其他相关对象一起根据需要实现app的很多行为(交互)。
然而,你需要在你的app中服从下面的规则:
- 提供一个main window显示你的app的内容
- 创建额外的windows(根据需要)显示其他的内容
新的iOS projects使用storyboards定义app的views。
storyboards需要app delegate上存在window属性,Xcode模版自动提供。
因此毫不费力地,新的project有main window来显示它们的视图控制器内容。
大多数app只需要一个window在主屏幕上显示app的内容。
你可以创建额外的window显示在主屏幕上,但额外的windows通常用来显示外部显示器。
除了提供window对显示app的内容,你还可以使用window对象来处理这些任务:
- 设置window的z轴水平,从而影响window相对于其他window的可见性。
- 显示windows 然后 使它们成为键盘事件的目标。
- 转换与window坐标系统相关的坐标值
- 改变window的root view controller
- 改变正显示在屏幕上的window
为你的app创建额外的windows
除了你的app的main window,你需要自己创建和配置额外的windows。额外的window的最常见用法是连接外部显示器显示内容,但你也可以在同一屏幕上显示多个window。
创建windows的是时候,总是设置window的初始size并且指定显示的屏幕。你也要指定root view controller和显示的内容。虽然你能够在window上直接添加子视图,但是提供root view controller对于管理window上的内容是更好的方式。
使用根视图控制器维护窗口对象和app显示在window上的内容之间的分离。
清单1显示了一个示例方法为一个在第二个屏幕上显示内容的视图控制器配置自定义window,这个例子假设实现这个方法的对象使用一个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,同一时间只有一个window是key window,你可以使用UIWindow的keyWindow属性来确认它的状态,很多时候,你的app的主window就是这个key window,但是UIKit可能会根据需要指定一个不一样的window。
如果你需要知道哪一个window是key,观察UIWindowDidBecomeKeyNotification和UIWindowDidResignKeyNotification通知。
系统发送这些通知来响应key window的改变,强制一个window变成key window或者从key window变为普通window,可以从这类调用恰当的方法。
方法
rootViewController window的根视图控制器
windowLevel window在z轴上的位置
screen window显示所在的屏幕
keyWindow 一个布尔值指明window是否是key window
- makeKeyAndVisible 显示和使这个window成为key window
- makeKeyWindow 使方法接收者成为key window
- becomeKeyWindow window变成key window后会自动调用这个方法
- resignKeyWindow window不再是key window后会自动调用这个方法
- convertPoint:toWindow: 转换当前window的坐标系统上的点到另外一个坐标系统的window
- convertPoint:fromWindow: 将一个点从一个给定的坐标系统的window转换到当前的window的坐标系统
- convertRect:toWindow: 转化当前坐标系下的window的矩形到另一个window的坐标系
- convertRect:fromWindow: 将另一个window的坐标系下的矩形转换到当前的window的坐标系
- sendEvent: 调度指定的事件到它的视图