iOS UIWindow及其应用

UIWindow简介

之前一直没理解AppDelegate里面的强引用UIWindow是什么东西,后来慢慢了解了UIWindow一些知识。


UIWindow继承自UIView,是一个特殊的UIView,我们一般不会直接去设置其UI展现形式,但它对展现程序中的views至关重要。每一个view,想要出现在屏幕上都依赖于window,但是程序中的window之间是相互独立的。应用程序收到事件之后会先转发给适当的window对象,从而又将事件转发给view对象。
以上简介摘自:
作者:ripperhe
链接:http://www.jianshu.com/p/98cd7fc4bfba


1, KeyWindow

KeyWindow是每一个App的主显示窗口,每个App有且只有一个KeyWindow,但是可以有多个UIWindow对象。
常见的纯代码创建AppDelegate的UIWindow

    self.window = [[UIWindow alloc] init];
    self.window.frame = [UIScreen mainScreen].bounds;
    ViewController *vc =[[ViewController alloc] init];
    self.window.rootViewController = vc;
    [self.window makeKeyAndVisible];

需要主要的是代码中的window需要强引用,不然代码已执行完就直接释放了。

2,其他的UIWindow

App中可以创建多个UIWindow对象,常见的有:
1,stutasWindow:用于管理状态栏
2,输入键盘window:(UITextEffectsWindow,UIRemoteKeyboardWindow)用户管理键盘输入
查看window的方法

[UIApplication sharedApplication].keyWindow;
[UIApplication sharedApplication].windows;
self.view.window;

3,UIWindow的等级属性

windowLevel显示等级,等级越高越在上面,分别为:

UIWindowLevelNormal  0.000000
UIWindowLevelAlert  2000.000000
UIWindowLevelStatusBar 1000.000000

所以我们通常可以看到状态栏的窗口可以一直悬浮在其他界面之上。

4,创建UIWindow

创建UIWindow无需addSubbiew 到view上面,系统会自动添加都屏幕上。

    dispatch_async(dispatch_get_main_queue(), ^{
        UIWindow *myWindow = [[UIWindow alloc] init];
        self.myWindow = myWindow;
        myWindow.windowLevel = UIWindowLevelAlert;
        myWindow.backgroundColor = [UIColor redColor];
        myWindow.frame = CGRectMake(30, 30, 30, 30);
        myWindow.hidden = NO;
    });

常用异步是因为防止还没有创建rootViewController的时候报错,或者采用延时创建亦可,UIWindow的hidden默认为YES,要改为NO方能显示。

5,常用UIWindow案例

1,点击状态栏将UISrollView回滚到顶部
实现的原理是在状态栏处添加了一个UIWindow, 并且该window的等级属性高于UIWindowLevelStatusBar ,可取为UIWindowLevelAlert,设置背景颜色为透明。
参考代码:

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    window_ = [[UIWindow alloc] init];
    window_.windowLevel = UIWindowLevelAlert;
    window_.frame = [UIApplication sharedApplication].statusBarFrame;
    window_.backgroundColor = [UIColor clearColor];
    window_.hidden = NO;
    [window_ addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(windowClick)]];
    });

2,蒙层添加到最上层
有时候,创建UIView灰色的蒙层会被UINaviBar或者UITabBar挡住,这时可将蒙层添加到controller.view.window上,可实现蒙层处于最上层,但是值得注意的是,controller.view.window要在viewDidLayoutSubviews函数之后才会赋值。
3,广告页面
从后台拉起程序的时候,显示广告页面,可以利用UIWindow实现

你可能感兴趣的:(iOS UIWindow及其应用)