UIWindow

UIWindow是一种特殊的UIView,通常在一个app中至少会有一个UIWindow

iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了

一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow

也就说,没有UIWindow,就看不见任何UI界面

UIWindow是一种特殊的UIView,通常在一个app中至少会有一个UIWindow

iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了

一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow

也就说,没有UIWindow,就看不见任何UI界面

系统创建原理

  1. 创建窗口
  2. 加载Main.storyboard,并且创建storyboard描述的控制器
  3. 把storyboard描述的控制器作为窗口的根控制器
  4. 显示窗口

代码创建

1.什么时候创建?

1.在加载info.plist文件之后,程序启动才完成,启动完成之后,就要显示窗口,因此在程序启动完成的时候创建窗口.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 窗口显示的注意点:
    // 1.一定要强引用
    // 2.控件要想显示出来,必须要有尺寸

    // 1.创建窗口
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    // 2.创建根控制器,在设置窗口的根控制器
    UIViewController *vc = [[UIViewController alloc] init];

    // 设置窗口的根控制器,底层会自动把根控制器的view添加到窗口上,并且让控制器的view有旋转功能
    self.window.rootViewController = vc;

    // 3.显示窗口
    // makeKeyAndVisible:让窗口成为应用程序的主窗口,并且显示窗口
    [self.window makeKeyAndVisible];

    return YES;
}

storyboard创建


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

//    [NSBundle mainBundle] loadNibNamed:<#(NSString *)#> owner:<#(id)#> options:<#(NSDictionary *)#>

    // 1.创建窗口
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];


    // 2.加载main.storyboard,创建main.storyboard描述的控制器
    // UIStoryboard专门用来加载stroyboard
    // name:storyboard名称不需要后缀
    // bundle:主bundle,传入nil,表示主bundle
    UIStoryboard *stroyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

    // 加载sotryboard描述的控制器
    // 加载箭头指向的控制器
    UIViewController *vc = [stroyboard instantiateInitialViewController];

    // 根据标识符创建storyboard描述的控制器
    //    UIViewController *vc = [stroyboard instantiateViewControllerWithIdentifier:@"blue"];

    // 设置窗口的根控制器
    self.window.rootViewController = vc;

    // 3.显示窗口
    [self.window makeKeyAndVisible];


    return YES;
}

xib创建


// xib加载控制器的步骤
// xib必须要有view去描述控制器
// 告诉xib中哪个view描述控制器view,如何告诉,就必须连线
// 让xib和控制器产生联系,告诉xib是用来描述一个控制器,设置Xib的File'owner为控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    // 1.创建窗口
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    // 为什么通过xib或者storyboard创建控制器,其实就是想搞一个view来描述控制器的view

    // 创建窗口的根控制器
    // 通过xib创建控制器
    ViewController *vc = [[ViewController alloc] initWithNibName:@"VC" bundle:nil];
    // 设置窗口的根控制器
    self.window.rootViewController = vc;
    // 3.显示窗口
    [self.window makeKeyAndVisible];
    return YES;
}

2.窗口层级关系 UIWindowLevelAlert > UIWindowLevelStatusBar > UIWindowLevelNormal

设置窗口的层级,层级谁大就显示在最外面

3.UITextField显示键盘

注意点:如果一个键盘想要弹出来,必须把textField添加到一个控件上.

扩展

makeKeyAndVisible方法的实现

  • 显示窗口并且成为主窗口
    1. 可以显示窗口 self.window.hidden = NO;
    2. 成为应用程序的主窗口 application.keyWindow = self.window;

results matching ""

    No results matching ""