iOS SDK详解之UIWindow(让视图在最上层)

来源:互联网 发布:软件驻场开发 编辑:程序博客网 时间:2024/06/08 16:59

目录(?)[+]

这个iOS SDK详解的专栏地址 
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;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

注意,UIWindow不需要像View那样进行addSubview添加到视图层次中,当Window创建的时候,就自动显示,通过WindowLevel来决多个window同时存在时候,哪个在上层,哪个在下层。


WindowLevel

系统提供的三个window level常量是

UIWindowLevelAlertUIWindowLevelNormalUIWindowLevelStatusBar
  • 1
  • 2
  • 3

通过log,可以看到其实际的值

    NSLog(@"%f %f %f",UIWindowLevelAlert,UIWindowLevelNormal,UIWindowLevelStatusBar);//2000.000000 0.000000 1000.000000
  • 1
  • 2

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

然后,创建一个以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;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

keyWindow

keyWindow是获取键盘和其他非触摸事件的window,同一时间只能有一个window为keywindow。所以,如果自己创建的Window要相应除触摸外的事件,要设置为keyWindowThe 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.
  • 1
  • 2
makeKeyWindow //设置当前window为main window.
  • 1

keyWindow的”生命周期” 
这两个方法类似于viewWillAppear等,自动触发,不要手动调用。

- becomeKeyWindow- resignKeyWindow
阅读全文
0 0
原创粉丝点击