iOS SDK详解之UIWindow(让视图在最上层)
2016-02-15 20:11
295 查看
这个iOS SDK详解的专栏地址
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html
1. 作为最顶层的视图容器,包含应用显示的所有的视图
2. 传递触摸和键盘等事件给视图
注意,UIWindow不需要像View那样进行
通过log,可以看到其实际的值
window在创建的时候,默认是UIWindowLevelNormal(0.0),这个值越大,层次越靠上,也就是说
windowLevel大于0,小于1000的时候,在statusbar之下,在默认的window之上
windowLevel大于1000的时候,就在statusbar之上了。
然后,创建一个以SecondViewController为根视图的Window
keyWindow的”生命周期”
这两个方法类似于viewWillAppear等,自动触发,不要手动调用。
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html
前言:
很多时候,我们希望视图显示在最上层,不管底部的层次结构如何,例如App的引导页,又比很多交易类App的弹出输入密码的提示框。UIWindow是什么?
UIWindow继承自UIView,也就是说它本身就是一个视图的容器。通常一个App只有一个UIWindow,也就是AppDelegate中的UIWindow。UIWindow的主要作用有两个1. 作为最顶层的视图容器,包含应用显示的所有的视图
2. 传递触摸和键盘等事件给视图
尝试使用UIWindow
- (IBAction)buttonClicked:(id)sender { window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; window.backgroundColor = [UIColor redColor]; window.windowLevel = UIWindowLevelAlert - 1; window.hidden = NO; UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissWindow)]; [window addGestureRecognizer:tap]; } -(void)dismissWindow{ window.hidden = YES; window = nil; }
注意,UIWindow不需要像View那样进行
addSubview添加到视图层次中,当Window创建的时候,就自动显示,通过
WindowLevel来决多个window同时存在时候,哪个在上层,哪个在下层。
WindowLevel
系统提供的三个window level常量是UIWindowLevelAlert UIWindowLevelNormal UIWindowLevelStatusBar
通过log,可以看到其实际的值
NSLog(@"%f %f %f",UIWindowLevelAlert,UIWindowLevelNormal,UIWindowLevelStatusBar); //2000.000000 0.000000 1000.000000
window在创建的时候,默认是UIWindowLevelNormal(0.0),这个值越大,层次越靠上,也就是说
windowLevel大于0,小于1000的时候,在statusbar之下,在默认的window之上
windowLevel大于1000的时候,就在statusbar之上了。
rootViewController
UIWindow的rootViewController为Window提供可视部分。例如如下代码,创建一个Statusbar部分可见的效果@interface SecondViewController () @end @implementation SecondViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]; CGFloat width = [UIScreen mainScreen].bounds.size.width; CGFloat height = [UIScreen mainScreen].bounds.size.height;; UIView * subview = [[UIView alloc] initWithFrame:CGRectMake(width/2,0,width/2,height)]; subview.backgroundColor = [UIColor redColor]; [self.view addSubview:subview]; // Do any additional setup after loading the view. } @end
然后,创建一个以SecondViewController为根视图的Window
- (IBAction)buttonClicked:(id)sender { window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; window.windowLevel = UIWindowLevelStatusBar + 1; window.hidden = NO; SecondViewController * rvc = [[SecondViewController alloc] init]; window.rootViewController = rvc; UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissWindow)]; [window addGestureRecognizer:tap]; } -(void)dismissWindow{ window.hidden = YES; window = nil; }
keyWindow
keyWindow是获取键盘和其他非触摸事件的window,同一时间只能有一个window为keywindow。所以,如果自己创建的Window要相应除触摸外的事件,要设置为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.
makeKeyWindow //设置当前window为main window.
keyWindow的”生命周期”
这两个方法类似于viewWillAppear等,自动触发,不要手动调用。
- becomeKeyWindow - resignKeyWindow
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- Android ADT 23.0.0无法更新到23.0.2问题解决方案
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- SDKMAN:轻松管理多个软件开发套件 (SDK) 的命令行工具
- Parse正式发布开源PHP SDK
- 基于Android SDK-在64位Linux中使用需要注意的问题
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- Android编程之SDK安装组件的离线安装方法分享
- .net平台推送ios消息的实现方法
- C#调用Nero SDK刻录光盘的方法
- 使用科大讯飞语音SDK实现文字在线合成语音