iOS UIWindow 与 windowLevel 学习

Posted ACM_Someone like you

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于iOS UIWindow 与 windowLevel 学习的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发UI篇—UIWindow简单介绍

iOS小技能:特殊的UIView(UIWindow)

UIWindow中的iOS UIScrollView

iOS:以编程方式创建 UIWindow 导致位置错误

iOS App 正在创建两个 UIWindow

iOS 8 - UIWindow 方向总是纵向的