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  但是如果 keyWindow 的windowLevel 小于其他的windowLevel 当前这个 KeyWindow 也不是在最最上层优先显示的
  3. UIWindow有三个层级,分别是Normal,StatusBar,Alert。 这三个层级的值 从左到右依次是0,1000,2000
  4. 根据UIWindow显示级别优先的原则,(UIWindow在显示的时候会根据UIWindowLevel进行排序的)即Level高的将“始终”排在所有windowLevel比他低的层级的前面显示出来。
  5. 系统默认的keyWindow 的windowLevel 是 Normal 那么 要优先显示创建的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
时间: 2024-11-09 19:22:28

iOS UIWindow 与 windowLevel 学习的相关文章

《iOS应用逆向工程》学习笔记(四)iOS程序类型

越狱iOS中最常见的程序有Application, Dynamic Library和Daemon三类. 1.Application 除了传统意义上的App外,越狱iOS平台上还有两种App形式的存在:WeeApp(依附于NotificationCenter的App)和PreferenceBundle(依附于Settings的App),常见于Cydia平台. 普通App的bundle中存放的是可执行程序和所需资源,而framework的bundle中存放的是动态链接库. 主要关注App中的三个部分

《iOS应用逆向工程》学习笔记(五)初尝越狱插件OpenSSH

首先在越狱机子上装上OpenSSH插件,然后查看设备的IP地址,这里假设为192.168.xxx.xxx. 然后用Mac上的Terminal通过Open SSH连接到设备上(初次登录密码是alpine,必须立即修改,否则任何人都可以连接到你的机子上搞破坏). 连接命令为:ssh [email protected]设备IP地址 修改密码命令为:passwd 例如: $ ssh [email protected] The authenticity of host '192.168.xxx.xxx (

《iOS应用逆向工程》学习笔记(六)使用dumpdecrypted砸壳

本来是打算用AppCrackr砸壳的,结果砸壳都是失败的,开始以为是App的加密太厉害了,后来才知道是因为AppCrackr太暴力了,引起公愤,结果被人投诉招致核心功能被迫关闭了. 幸好在RE官网搜到一个用dumpdecrypted砸壳的帖子.下面是我砸壳的经历. 一.造锤 1.下载dumpdecrypted源码 下载地址:https://github.com/stefanesser/dumpdecrypted/archive/master.zip,接着在Mac中解压. 2.确认iOS设备的版本

《iOS应用逆向工程》学习笔记(二)iOS系统目录结构(部分)

首先下载个iFile,可以用来直观地查看iOS系统的目录结构. 下面记录一些关键的iOS目录结构: /var:"variable"的简写,存放一些经常更改的文件,例如日志.用户数据.临时文件等.其中/var/mobile/Applications下存放了所有App Store App. /Applications:存放所有的系统App和来自Cydia的App,不包括App Store App.越狱的过程把/Applications变成了一个符号链接,实际指向/var/stash/App

《iOS应用逆向工程》学习笔记(三)iOS文件权限

一个组可以包含多个用户,一个用户可以属于多个组. iOS中的每个文件都有一个属主用户和属主组.每个文件都具有一系列的权限. 在iOS中用3bit表示文件的使用权,从高位到低位分别是r(read), w(write), x(execute)权限. 文件和用户的关系存在三种可能性:(1)此用户是属主用户:(2)此用户不是属主用户,但在属主组里:(3)此用户既不是属主用户,也不在属主组里. 例如: 111101101代表rwxr-xr-x,其8进制为755,它表示该文件的属主用户拥有r, w, x权限

IOS开发-OC学习-常用功能代码片段整理

IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是在做与URL有关的功能时,需要在Info.plist中添加一段代码进而实现让网址完成从Http到Https的转换,以及其他的一些功能. 在从一个新手到逐渐学会各种功能.代码.控件.方法如何使用的过程中,也在逐渐积累一些知识,但是一次总不会把这些东西都深刻记住并完全理解.所以在这儿记录下这些东西,用来

iOS动画详解(学习动画看这一篇就够了)

iOS动画详解(学习动画看这一篇就够了) 一.基础知识 CAAnimation.png 二.CABasicAnimation 1. 动画的属性和解释 2.属性值的解释 repeatCount : 如果在swift中需要一直不断重复:Float.infinity,OC:HUGE_VALF timingFunction: timingFunction.png kCAMediaTimingFunctionLinear--在整个动画时间内动画都是以一个相同的速度来改变.也就是匀速运动.一个线性的计时函数

iOS copy 和 mutableCopy 学习

(参考 iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期)的对象部分 关于Copy  有个经典问题”大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢” 或者说”为什么 NSString 类型成员变量的修饰属性用 copy 而不是 strong (或 retain ) ?” 明显 第一句比第二句 严谨多了. @property (strong,nonatomic) NSString *strongString; & @property

【ios】系统框架学习

iOS的系统架构分为四个层次:核心操作系统层(Core OS layer).核心服务层(Core Services layer).媒体层(Media layer)和可触摸层(Cocoa Touch layer). Core OS : 位于iOS系统架构最下面的一层是核心操作系统层,它包括内存管理.文件系统.电源管理以及一些其他的操作系统任务.它可以直接和硬件设备进行交互. Core Services : 第二层是核心服务层,我们可以通过它来访问iOS的一些服务. Media : 第三层是媒体层,