UIKit-UIWindow详解

(文章转载自:http://www.jianshu.com/p/2d4dcf7d97eb

UIKit-UIWindow详解

字数1561 阅读172 评论0 

UIWindow继承图
UIWindow继承图

属性

1.screen (window的屏幕)

/*
 * window的屏幕,默认是 [UIScreen mainScreen] ,不能更改,否则没有界面
 */
@property(nonatomic,retain) UIScreen *screen NS_AVAILABLE_IOS(3_2);

2.windowLevel (window层级)

/*
 * window的视图层级,默认是0.0
 */
@property(nonatomic) UIWindowLevel windowLevel;
 typedef CGFloat UIWindowLevel;

通过 typedef 将 CGFloat 转义成 UIWindowLevel 
windowLevel 属性的类型为 UIWindowLevel , 其实就是 CGFloat ,只是转义一下更易于理解

windowLevel有以下三种:

  • UIWindowLevelNormal;// 0.000000
  • UIWindowLevelStatusBar;// 1000.000000
  • UIWindowLevelAlert;// 2000.000000

3.keyWindow (是否是keyWindow)

@property(nonatomic,readonly,getter=isKeyWindow) BOOL keyWindow

4.rootViewController (根控制器)

/*
 * window的根控制器,默认是nil
 */
@property(nonatomic,retain) UIViewController *rootViewController NS_AVAILABLE_IOS(4_0);

方法

- (void)becomeKeyWindow;                               // 不可直接调用
- (void)resignKeyWindow;                               // 不可直接调用

- (void)makeKeyWindow;
- (void)makeKeyAndVisible;                             // 大部分apps 通过调用这个方法显示主window并将window设为key,否则用视图的隐藏属性
- (void)sendEvent:(UIEvent *)event;                    // 通过UIApplication 调用来分发任务给window 中的视图

- (CGPoint)convertPoint:(CGPoint)point toWindow:(UIWindow *)window;    // 把该window中的一个坐标转换成在目标window中时的坐标值
- (CGPoint)convertPoint:(CGPoint)point fromWindow:(UIWindow *)window;  // 把目标window中的一个坐标转换成在该window中时的坐标值
- (CGRect)convertRect:(CGRect)rect toWindow:(UIWindow *)window;  // 把该window中的一个矩阵转换成在目标window中时的矩阵值
- (CGRect)convertRect:(CGRect)rect fromWindow:(UIWindow *)window;// 把目标window中的一个矩阵转换成在该window中时的矩阵值

常量

监测window的通知:

UIKIT_EXTERN NSString *const UIWindowDidBecomeVisibleNotification; // 当window激活时并展示在界面的时候触发,返回空
UIKIT_EXTERN NSString *const UIWindowDidBecomeHiddenNotification;  // 当window隐藏的时候触发,暂时没有实际测,返回空
UIKIT_EXTERN NSString *const UIWindowDidBecomeKeyNotification;     // 当window被设置为keyWindow时触发,返回空
UIKIT_EXTERN NSString *const UIWindowDidResignKeyNotification;     // 当window的key位置被取代时触发,返回空

监测键盘的通知:

UIKIT_EXTERN NSString *const UIKeyboardWillShowNotification; 
UIKIT_EXTERN NSString *const UIKeyboardDidShowNotification; 
UIKIT_EXTERN NSString *const UIKeyboardWillHideNotification; 
UIKIT_EXTERN NSString *const UIKeyboardDidHideNotification;
UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification  NS_AVAILABLE_IOS(5_0);
UIKIT_EXTERN NSString *const UIKeyboardDidChangeFrameNotification   NS_AVAILABLE_IOS(5_0);

实例

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    /*
     * 1 监测window
     */

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(windowDidBecomeVisible:) name:UIWindowDidBecomeVisibleNotification object:nil];

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(windowDidBecomeHidden:) name:UIWindowDidBecomeHiddenNotification object:nil];

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(windowDidBecomeKey:) name:UIWindowDidBecomeKeyNotification object:nil];

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(windowDidResignKey:) name:UIWindowDidResignKeyNotification object:nil];

    /*
     * 2 监测keyboard
     */
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillShowNotification:) name:UIKeyboardWillShowNotification object:nil];

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardDidShowNotification:) name:UIKeyboardDidShowNotification object:nil];

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillHideNotification:) name:UIKeyboardWillHideNotification object:nil];

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardDidHideNotification:) name:UIKeyboardDidHideNotification object:nil];

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillChangeFrameNotification:) name:UIKeyboardWillChangeFrameNotification object:nil];

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardDidChangeFrameNotification:) name:UIKeyboardDidChangeFrameNotification object:nil];

    // window0
    self.window0 = [[UIWindow alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
    self.window0.backgroundColor = [UIColor purpleColor];
    self.window0.windowLevel = UIWindowLevelNormal;
    UITextField *tf0 = [[UITextField alloc]initWithFrame:CGRectMake(0, 20, 100, 20)];
    tf0.layer.borderColor = [UIColor blueColor].CGColor;
    tf0.layer.borderWidth = 1;
    tf0.delegate = self;
    [self.window0 addSubview:tf0];
    UILabel *lab0 = [[UILabel alloc]initWithFrame:CGRectMake(0, 40, 100, 20)];
    lab0.text = @"视图一";
    lab0.font = [UIFont boldSystemFontOfSize:18];
    [self.window0 addSubview:lab0];
    [self.window0 makeKeyAndVisible];

    // window1
    self.window1 = [[UIWindow alloc]initWithFrame:CGRectMake(100, 100, [UIScreen mainScreen].bounds.size.width - 100, [UIScreen mainScreen].bounds.size.height- 100)];
    self.window1.backgroundColor = [UIColor brownColor];
    self.window1.windowLevel = UIWindowLevelStatusBar;
    UITextField *tf1 = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 100, 20)];
    tf1.layer.borderColor = [UIColor blueColor].CGColor;
    tf1.layer.borderWidth = 1;
    tf1.delegate = self;
    [self.window1 addSubview:tf1];
    UILabel *lab1 = [[UILabel alloc]initWithFrame:CGRectMake(0, 40, 100, 20)];
    lab1.text = @"视图二";
    lab1.font = [UIFont boldSystemFontOfSize:18];
    [self.window1 addSubview:lab1];
    [self.window1 makeKeyAndVisible];

    // window2
    self.window2 = [[UIWindow alloc] initWithFrame:CGRectMake(200, 200, [UIScreen mainScreen].bounds.size.width - 200, [UIScreen mainScreen].bounds.size.height- 200)];
    self.window2.windowLevel = UIWindowLevelAlert;
    self.window2.backgroundColor = [UIColor redColor];
    UITextField *tf2 = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 100, 20)];
    tf2.layer.borderColor = [UIColor blueColor].CGColor;
    tf2.layer.borderWidth = 1;
    tf2.delegate = self;
    [self.window2 addSubview:tf2];
    UILabel *lab2 = [[UILabel alloc]initWithFrame:CGRectMake(0, 40, 100, 20)];
    lab2.text = @"视图三";
    lab2.font = [UIFont boldSystemFontOfSize:18];
    [self.window2 addSubview:lab2];
    [self.window2 makeKeyAndVisible];

    CGPoint p = [self.window1 convertPoint:CGPointMake(0, 0) toWindow:self.window0];
    NSLog(@"%@",NSStringFromCGPoint(p));
    NSLog(@"-------------%@",[UIApplication sharedApplication].keyWindow);

    return YES;
}

- (void)windowDidBecomeVisible:(NSNotification *)notification {
    NSLog(@"1  1-------  windowDidBecomeVisible");
}

- (void)windowDidBecomeHidden:(NSNotification *)notification {
    NSLog(@"1  --2-----  windowDidBecomeHidden");
}

- (void)windowDidBecomeKey:(NSNotification *)notification {
    NSLog(@"1  ----3---  windowDidBecomeKey");
}

- (void)windowDidResignKey:(NSNotification *)notification {
    NSLog(@"1  ------4-  windowDidResignKey");
}

- (void)keyboardWillShowNotification:(NSNotification *)notification {
    NSLog(@"2  1-----------  keyboardWillShowNotification");
}

- (void)keyboardDidShowNotification:(NSNotification *)notification {
    NSLog(@"2  --2---------  keyboardDidShowNotification");
}

- (void)keyboardWillHideNotification:(NSNotification *)notification {
    NSLog(@"2  ----3-------  keyboardWillHideNotification");
}

- (void)keyboardDidHideNotification:(NSNotification *)notification {
    NSLog(@"2  ------4-----  keyboardDidHideNotification");
}

- (void)keyboardWillChangeFrameNotification:(NSNotification *)notification {
    NSLog(@"2  --------5---  keyboardWillChangeFrameNotification");
}

- (void)keyboardDidChangeFrameNotification:(NSNotification *)notification {
    NSLog(@"2  ----------6-  keyboardDidChangeFrameNotification");
}

效果图:

效果图
效果图

windowLevel:self.window0 < self.window1 < self.window2
即 UIWindowLevelNormal<UIWindowLevelStatusBar<UIWindowLevelAlert
最后self.window2为keyWindow,第一次加载的Log为:

2015-03-17 18:24:23.783 UIWindow-Test[14827:599441] 1  1-------  windowDidBecomeVisible
2015-03-17 18:24:23.784 UIWindow-Test[14827:599441] 1  ----3---  windowDidBecomeKey
2015-03-17 18:24:23.786 UIWindow-Test[14827:599441] 1  1-------  windowDidBecomeVisible
2015-03-17 18:24:23.786 UIWindow-Test[14827:599441] 1  ------4-  windowDidResignKey
2015-03-17 18:24:23.786 UIWindow-Test[14827:599441] 1  ----3---  windowDidBecomeKey
2015-03-17 18:24:23.790 UIWindow-Test[14827:599441] 1  1-------  windowDidBecomeVisible
2015-03-17 18:24:23.790 UIWindow-Test[14827:599441] 1  ------4-  windowDidResignKey
2015-03-17 18:24:23.791 UIWindow-Test[14827:599441] 1  ----3---  windowDidBecomeKey

点击视图一输入框时的Log:

2015-03-17 18:44:08.006 UIWindow-Test[14827:599441] 1  1-------  windowDidBecomeVisible
2015-03-17 18:44:08.070 UIWindow-Test[14827:599441] 2  --------5---  keyboardWillChangeFrameNotification
2015-03-17 18:44:08.070 UIWindow-Test[14827:599441] 2  1-----------  keyboardWillShowNotification
2015-03-17 18:44:08.070 UIWindow-Test[14827:599441] 1  ------4-  windowDidResignKey
2015-03-17 18:44:08.070 UIWindow-Test[14827:599441] 1  ----3---  windowDidBecomeKey
2015-03-17 18:44:08.600 UIWindow-Test[14827:599441] 2  ----------6-  keyboardDidChangeFrameNotification
2015-03-17 18:44:08.600 UIWindow-Test[14827:599441] 2  --2---------  keyboardDidShowNotification

在视图一输入框激活的情况下点击视图二的输入框的Log:

2015-03-17 18:45:15.110 UIWindow-Test[14827:599441] 1  ------4-  windowDidResignKey
2015-03-17 18:45:15.110 UIWindow-Test[14827:599441] 1  ----3---  windowDidBecomeKey

在视图二输入框激活的情况下点击视图三的输入框的Log:

2015-03-17 18:48:41.342 UIWindow-Test[14827:599441] 1  ------4-  windowDidResignKey
2015-03-17 18:48:41.343 UIWindow-Test[14827:599441] 1  ----3---  windowDidBecomeKey

收起键盘的Log:

2015-03-17 18:49:21.035 UIWindow-Test[14827:599441] 2  --------5---  keyboardWillChangeFrameNotification
2015-03-17 18:49:21.035 UIWindow-Test[14827:599441] 2  ----3-------  keyboardWillHideNotification
2015-03-17 18:49:21.540 UIWindow-Test[14827:599441] 2  ----------6-  keyboardDidChangeFrameNotification
2015-03-17 18:49:21.540 UIWindow-Test[14827:599441] 2  ------4-----  keyboardDidHideNotification
posted @ 2016-01-13 17:30  我叫南部21号  阅读(271)  评论(0)    收藏  举报