UIWindow的学习参考文顶顶大神的,实在总结的非常好,要注意的点,和概念都非常清楚。
http://www.cnblogs.com/wendingding/p/3770052.html
这里补充一些:
typedef CGFloat UIWindowLevel;
枚举类型的UIWindowLevel。
@property(nonatomic) UIWindowLevel windowLevel; // default = 0.0
用这个来定义了一个windowLevel属性。
UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar __TVOS_PROHIBITED;
关于这个属性分别有三个不同级别的参数,普通级别,Alert弹窗级别,状态栏级别。
- (CGPoint)convertPoint:(CGPoint)point toWindow:(nullable UIWindow *)window; // can be used to convert to another window
- (CGPoint)convertPoint:(CGPoint)point fromWindow:(nullable UIWindow *)window; // pass in nil to mean screen
- (CGRect)convertRect:(CGRect)rect toWindow:(nullable UIWindow *)window;
- (CGRect)convertRect:(CGRect)rect fromWindow:(nullable UIWindow *)window;
这几个方法非常有印象吧,就是和UIView的那几个坐标系的转换方法大同小异。
@property(nonatomic,readonly,getter=isKeyWindow) BOOL keyWindow;
判断是否主窗口的布尔属性。
还有大量的通知的key 。
在实际使用中遇到一个BUG:
- (IBAction)backBtnFun:(id)sender
{
[[[UIApplication sharedApplication] delegate] window].rootViewController = _windowRootViewController;
}
这样地操作发现无法操作相应得到的页面。
#define KEYWINDOW [UIApplication sharedApplication].keyWindow
#define GetKeyWindow KEYWINDOW ? KEYWINDOW : [[UIApplication sharedApplication].windows objectAtIndex:0]
- (IBAction)backBtnFun:(id)sender
{
UIWindow* keyWindow = GetKeyWindow;
keyWindow.rootViewController = _windowRootViewController;
}
经过这样的修改解决了问题。
现在经过学习就非常明确了:
[UIApplication sharedApplication].keyWindow 等价于 [[UIApplication sharedApplication].windows objectAtIndex:0]
从上面定义的宏就可以看得出来。
但是:
[[[UIApplication sharedApplication] delegate] window].rootViewController 并不一定是当前的keywindow,相信这个非常好理解吧!
扯到UIApplication就多说几句,因为联系挺大的,在UIApplication里面关系到UIWindow的属性主要有:
@property(nullable, nonatomic,readonly) UIWindow *keyWindow;
@property(nonatomic,readonly) NSArray<__kindof UIWindow *> *windows;
上面已经出现过了。
@property (nullable, nonatomic, strong) UIWindow *window NS_AVAILABLE_IOS(5_0);
这个属性是在使用storyboard的时候才用到的,不管它。
还有一些是联系到屏幕方向的,这个在屏幕方面的专题都讲过。
最后提个疑问,那为什么这个delegate 拥有window属性呢?
[[[UIApplication sharedApplication] delegate] window].rootViewController
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
那我们难不成每次都要获取keywindow吗? 肯定不是啦!
创建一个新的,记得帮它makeKeyAndVisible即可:
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window makeKeyAndVisible];