• iOS UIWindow 与 windowLevel 学习


    Pop几个关键点

    1.  KeyWindow :”The key window is the one that is designated to receive keyboard and other non-touch     related events. Only one window at a time may be the key window会使对象主窗口展示在最前端
    2.  makeKeyAndVisible  方法使 对象window成为了 KeyWindow  但是如果 keyWindowwindowLevel 小于其他的windowLevel 当前这个 KeyWindow 也不是在最最上层优先显示的
    3. UIWindow有三个层级,分别是Normal,StatusBar,Alert。 这三个层级的值 从左到右依次是0,1000,2000
    4.  根据UIWindow显示级别优先的原则,(UIWindow在显示的时候会根据UIWindowLevel进行排序的)即Level高的将“始终”排在所有windowLevel比他低的层级的前面显示出来。
    5. 系统默认的keyWindowwindowLevelNormal 那么 要优先显示创建的windowLevel 必须大于等于Normal 才会展示在上层。
    6.  创建 UIWindow 不用添加到任何的控件上面,直接创建完毕 即自动添加到UIWindow 上 创建方式 展示  销毁 都和 一般 UIView 的方式有区别 参见代码注释

    示意图:

    参见代码:

    //
    //  HFWindowViewController.m
    //  SectionDemo
    //
    //  Created by HF on 2017/5/25.
    //  Copyright © 2017年 HF-Liqun. All rights reserved.
    //
    
    #import "HFWindowViewController.h"
    
    @interface HFWindowViewController ()
    
    // 创建属性
    @property (nonatomic, strong)UIWindow *myWindow1;
    
    @end
    
    @implementation HFWindowViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 创建测试按钮
        UIButton *tempBtn = [UIButton buttonWithType:UIButtonTypeSystem];
        tempBtn.frame = CGRectMake(15,64, self.view.frame.size.width - 15 * 2, 64);
        [tempBtn setTitle:@"点我创建一个window" forState:UIControlStateNormal];
        // 通过按钮的点击事件生成不同windowLevel级别的window
        [tempBtn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:tempBtn];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    #pragma mark- event
    
    - (void)clickBtn:(id)sender
    {
        [self test1];
    }
    
    - (void)clickWindowBtn:(id)sender
    {
        //window 销毁
        self.myWindow1.hidden = YES; //可有可无 看 UI效果
        self.myWindow1 = nil; // 这个方法是真正移除 UIWindow
    }
    
    #pragma mark - private
    
    /**
     *  
     *1、创建 window 不用添加到任何的控件上面,直接创建完毕 即自动添加到window 上
     *2、创建一个比默认window的windowLevel大的window来看一下什么效果,效果是会盖在原来的window上面
     */
    - (void)test1
    {
        // 创建window
        if (self.myWindow1 == nil) {
    
            if (IOS9) {//>=iOS9
                self.myWindow1 =  [UIWindow new]; // 以后 默认了 window的大小
            } else {
                self.myWindow1 =  [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];//这么写在哪个版本系统上,一点毛病都没有
            }
            
            UIButton *windowBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            [windowBtn setTitle:@"点我 销毁黄色 window" forState:UIControlStateNormal];
            windowBtn.backgroundColor = [UIColor redColor];
            windowBtn.frame = CGRectMake(15, 64, self.view.frame.size.width - 15 * 2, 64);
            [windowBtn addTarget:self action:@selector(clickWindowBtn:) forControlEvents:UIControlEventTouchUpInside];
            [self.myWindow1 addSubview:windowBtn];
            
        }
        // 设置window的颜色,这里设置成黄色,方便查看window的层级关系
        self.myWindow1.backgroundColor = [UIColor yellowColor];
        // 设置 window 的 windowLevel
        self.myWindow1.windowLevel = UIWindowLevelStatusBar; //TODO: Normal,StatusBar,Alert 分别 为 0,1000,2000 可以修改这里体验 层级变化 对 展示 window的影响
        self.myWindow1.hidden = NO;
        [self.myWindow1  makeKeyAndVisible]; //成为keyWindow
    }
    
    @end
  • 相关阅读:
    著名的二分查找的BUG
    C/C++ static用法
    浅谈C++虚函数
    git备忘(长久更新)
    【经典问题】最大子串和
    水波纹效果
    博客迁址 xpeng.scorpionstudio.com
    终于,我们的新产品Fotor Slideshow Maker上线了!!
    分享一款浏览器扩展--美图搜索-图片搜索工具
    分享网页微信防撤回插件
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/6973304.html
Copyright © 2020-2023  润新知