UIWindow

UIWindow : UIView
Screen - Window - ViewController
一般 APP 一个 window,也可以手动添加多个,常见的 HUD 就是 window 方式;

基本

  • 创建window,并且绑定一个 VC,然后使 window 可见,这是最常见的了;
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    ViewContoller *rootVC = [[ViewContoller alloc] init];
    [self.window setRootViewController:rootVC];
    
    [self.window makeKeyAndVisible];

属性

    self.window.screen;
    self.window.isKeyWindow;

多 window 切换

  • 默认同级别的 window
    // window2 初始略,此处为注册 window,但是不显示
    [self.window2 makeKeyWindow];
    
    // 2 个 window 相互切换
    [[UIApplication sharedApplication].windows enumerateObjectsUsingBlock:^(__kindof UIWindow * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if (obj != [UIApplication sharedApplication].keyWindow) {
            [obj makeKeyAndVisible];
            *stop = YES;
        }
    }];
  • 不同级别的 window
self.window.windowLevel = UIWindowLevelNormal;

UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal;// 0
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert;// 2000
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar;// 1000
也可以自定义,级别越大,在 makeKeyAndVisible 后,处于上方(就是 z-index)

但是不知道这么去,注销释放 makeKeyAndVisible 的 window

相对位置转换

    // window2 中的 (100,50)相对于 window 中的 point位置;p1=(200,150)
    CGPoint p1 = [self.window2 convertPoint:CGPointMake(100, 50) toWindow:self.window];
    
    // window 中的 (100,50)相对于 window2 中的 point位置;p2=(0,-50)
    CGPoint p2 = [self.window2 convertPoint:CGPointMake(100, 50) fromWindow:self.window];

CGRect 类似;

通知

  • window 通知
UIKIT_EXTERN NSNotificationName const UIWindowDidBecomeVisibleNotification;
UIKIT_EXTERN NSNotificationName const UIWindowDidBecomeHiddenNotification;
UIKIT_EXTERN NSNotificationName const UIWindowDidBecomeKeyNotification;
UIKIT_EXTERN NSNotificationName const UIWindowDidResignKeyNotification;
  • 键盘通知
UIKIT_EXTERN NSNotificationName const UIKeyboardWillShowNotification;
UIKIT_EXTERN NSNotificationName const UIKeyboardDidShowNotification;
UIKIT_EXTERN NSNotificationName const UIKeyboardWillHideNotification;
UIKIT_EXTERN NSNotificationName const UIKeyboardDidHideNotification;
UIKIT_EXTERN NSNotificationName const UIKeyboardWillChangeFrameNotification;
UIKIT_EXTERN NSNotificationName const UIKeyboardDidChangeFrameNotification;

// userInfoKey
UIKIT_EXTERN NSString *const UIKeyboardFrameBeginUserInfoKey; // NSValue of CGRect
UIKIT_EXTERN NSString *const UIKeyboardFrameEndUserInfoKey; // NSValue of CGRect
UIKIT_EXTERN NSString *const UIKeyboardAnimationDurationUserInfoKey; // NSNumber of double
UIKIT_EXTERN NSString *const UIKeyboardAnimationCurveUserInfoKey; // NSNumber of NSUInteger (UIViewAnimationCurve)
UIKIT_EXTERN NSString *const UIKeyboardIsLocalUserInfoKey; // NSNumber of BOOL

事件

    [self.window sendEvent:event];

这个有待深入研究 event