欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS - 创建UIWindow

程序员文章站 2022-04-12 20:31:13
iOS程序启动完毕后,创建的第一个试图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上 APPdelegate.m - (...

iOS程序启动完毕后,创建的第一个试图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上

APPdelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    // 窗口注意点:1.不要被销毁,需要弄一个强引用 2.必须窗口的尺寸
    // 1.新建窗口对象
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor yellowColor];
    // 2.创建窗口的根控制器,并且赋值
    UIViewController *rootVc = [[UIViewController alloc] init];
    rootVc.view.backgroundColor = [UIColor greenColor];
    self.window.rootViewController = rootVc;
    // 3.显示窗口
    [self.window makeKeyAndVisible];


    return YES;
}

键盘和状态栏都是窗口

UITextField *text = [[UITextField alloc] init];
[text becomeFirstResponder];
[self.window addSubview:text];

窗口层级

UIWindowLevelNormal
UIWindowLevelStatusBar
UIWindowLevelAlert

alert最大,层级可以加减


通过storyboard加载控制器

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    // 1. 创建窗口
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    // 2.加载main.storyboard
    // name:storyboard名称不需要后缀
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    // 加载storyboard控制器
    // 默认加载箭头指向的控制器
    //UIViewController *vc = [storyboard instantiateInitialViewController];

    // 通过标识符加载控制器
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"blue"];
    // 设置窗口的根控制器
    self.window.rootViewController = vc;

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

通过xib创建控制器

iOS - 创建UIWindow

iOS - 创建UIWindow

// xib加载控制器步骤
// xib必须有view去描述控制器
// xib中哪个view描述控制器view,必须连线
// 让xib和控制器产生连线,告诉xib是用来描述控制器
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
ViewController *vc = [[ViewController alloc] initWithNibName:@"vc" bundle:nil];      
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];

loadview方法加载控制器

底层实现:判断下有没有指定的storyboard,如果有,就会创建storyboard描述的控制器的view,如果没有就会创建一个空的view

// 作用:加载控制器的view,调用时间:当控制器的view第一次使用的时候调用
// BGView是新创建的继承于UIView的对象
- (void)loadView
{
    BGView *view = [[BGView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.view = view;
    self.view.backgroundColor = [UIColor redColor];
}