App视图启动的两个方式
通过StoryBoard建立的视图
通过StoryBoard建立的视图,会在info.plist里有一个键值Main storyboard file base name,可以改更第一次启动的StoryBoard的文件
通过xib或者纯代码建立的视图(initWithNib)
如果通过xib或者纯代码建立的视图,需要在AppDelegate.m里的 application:willFinishLaunchingWithOptions: 实现以下代码
1 | - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions { |
以上是旧版代码,新版代码 Application 里面内置了一个window对象,可以用 self.window
1 | var window: UIWindow? |
代码完成了以下工作
- 创建一个和当前设备屏幕同样大小的Window
- 创建一个ViewController
- 让ViewController成为Window的RootView
- 让Window成为KeyWindow和Visible(顶置到最前)
需要注意的事情
- Window一定要和UIScreen的尺寸一样大,不然没有填充的地方就是黑色的
- 一定要makeKeyAndVisible,不然无法显示
什么是AppDelegate
AppDelegate就是你的程序的委托,实现了iOS本身和你的App的一些交互,你的程序安装到iOS里,就会有一个指针指向你的App(猜测),大厅是委托者,你的App是执行者(iOS.delegate = app),遵循AppDelegate的Protocol.
所以说启动程序,就是大厅执行了一个函数启动并进入了你的App,伪代码可以理解成[iOS launchApp:app],就进入了你的程序.你的程序的所有代码对于iOS这个系统来讲,都在一个出不去的函数里.
对于iOS本身和你App的交互,都在AppDelegate的协议里进行,比如进入后台等等.
什么是Window
任何可视化程序,包括操作系统,都是由以下视图结构构成: DrawContext(Screen)-Window-View-Context, DrawContext就是C++里的DC,承载像素点.像素点组成Window,Window(窗口)里可以管理不同的View(视图),View本身是由Context(上下文组成)
官方文档为Understanding Windows and Screens
1. Window包括什么
Window主要包括三个功能点
- 承担响应者Response,用来反馈交互.
- 管理View,包括View的朝向Orientation
- Screen指针,指向显示这个Window的Screen屏幕
2. Window的等级
在iOS上WindowLevel分为三个等级,通常所有的窗口都是Normal,窗口的等级都是根据排序来的,越靠前越高,Mac上不清楚分几个等级.
const UIWindowLevel UIWindowLevelNormal;
const UIWindowLevel UIWindowLevelAlert;
const UIWindowLevel UIWindowLevelStatusBar;
3. 什么是keyWindow
由Window等级可以知道一个Screen可以有多个Window,最典型的就是类似Mac桌面操作系统上,或者说iOS的Alert是一个Window,同时还存在app的主Window.但是我们的交互(键盘,触摸)指令是发送给哪个Window呢,所以就有了KeyWindow的概念,就是MFC里的焦点窗口.
由于iOS的程序只有一个Window,所有的界面都是在不同的View上展示的,所以默认的Window就应该是KeyWindow.而当Alert弹出的时候,KeyWindow会转移到Alert的Window上,你的交互才能被Alert窗口响应KeyWindow掌控着响应者链条,如果你不是init一个和UIScreen一样大小的Window,在没有被Window覆盖的Screen或者View无法响应用户操作
4. makeKeyAndVisible干了什么
就是让你在App启动后,初始化的Window窗口变成该app的KeyWindow,用来响应操作,然后通过Visible顶置到所有Window的最前
5. 不是说iOS的app只有一个Window,为毛要Visible
通常iOS只有一个Window,但是并不说不可以有两个Window,在通过外接屏幕的时候,可以让外接的屏幕作为第二个Window来展示信息(duetdisplay这个App),可以参考官方文档Using Windows to Present Content on Multiple Displays所以要Visible到最前