美文网首页
iOS UIWindow及其应用

iOS UIWindow及其应用

作者: tangbin583085 | 来源:发表于2017-08-27 11:25 被阅读0次

    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及其应用

          本文链接:https://www.haomeiwen.com/subject/tkvcdxtx.html