UIWindow
The backdrop for your app’s user interface and the object that dispatches events to your views.
UIWindow是应用用户界面的背景和调度事件反馈到视图的对象。
声明
@interface UIWindow: window
概述
Windows与视图控制器配合使用来处理事件和完成其他操作,这些操作是应用程序的基础。
仅在需要执行以下操作时才使用Windows:
- 提供一个主窗口来显示您的应用程序的内容。
- 创建其他窗口(根据需要)以显示其他内容。
通常,Xcode为你提供你的app主窗口,现在iOS工程使用storyboard来定义app的视图。storyboard需要应用程序代理对象上提供window的属性,Xcode的模板会自动提供。如果你的应用不需要使用stroyboard,你需要自己创建应用程序窗口。iOS13移除stroyborad
// oc
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
// swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
}
了解关键窗口交互
尽管触摸事件被传递到发生它们的窗口,但是没有相关坐标值的事件被传递到按键窗口。 一次只能将一个窗口用作key窗口,并且可以使用窗口的isKeyWindow属性来确定其状态。 在大多数情况下,您应用的主窗口是关键窗口,但是UIKit可以根据需要指定其他窗口。
使用
UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow。iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了。一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow。也就说,没有UIWindow,就看不见任何UI界面。
UIWindow2种创建方式
storyboard
为什么创建一个storyboard,没有看到创建UIWindow的过程?
它其实是把创建UIWindow的过程给屏蔽起来了。可以把代理的UIWindow的属性的值打印出来NSLog(@“window=%p”,self.window);打印出来确实是有值的,说明确实创建了UIWindow.不仅创建了UIWindow,默认还创建了UIWindow对应的控制器,也可以打印进行查看。NSLog(@“%@“,self.window.rootviewcontroller);
有storyboard的项目中的创建过程:
当用户点击应用程序图标的时候,先执行Main函数,执行UIApplicationMain(),根据其第三个和第四个参数创建Application,创建代理,并且把代理设置给application(看项目配置文件info.plist里面的storyboard的name,根据这个name找到对应的storyboard),开启一个事件循环,当程序加载完毕,他会调用代理的didFinishLaunchingWithOptions:方法。在调用didFinishLaunchingWithOptions:方法之前,会加载storyboard,在加载的时候创建一个window,接下来会创建箭头所指向的控制器,把该控制器设置为UIWindow的根控制器,接下来再将window显示出来,即看到了运行后显示的界面。
纯代码创建
参考文章:纯代码创建UIWindow
贴出主要代码,完成window的初始化,设置window的根视图控制器,将window设为主窗口并显示。
#import "AppDelegate.h"
#import "ViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = [[ViewController alloc] init];
[self.window makeKeyAndVisible];
return YES;
}
@end
UI框架
基于TabBarController + NavigationController方案
现在主流的框架方案:NavigationController + TabBarController