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

版权声明:本文为博主原创文章,如需转载请注明出处

目录(?)[+]

这个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常量是

UIWindowLevelAlert
UIWindowLevelNormal
UIWindowLevelStatusBar
  • 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要相应除触摸外的事件,要设置为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.
  • 1
  • 2
makeKeyWindow //设置当前window为main window.
  • 1

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

- becomeKeyWindow
- resignKeyWindow
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值