UIWindow

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


那是因为这个delegate属性返回的id对象就是我们全局唯一的代理对象,代理对象默认是拥有一个UIWindow的属性的哦:

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;


那我们难不成每次都要获取keywindow吗? 肯定不是啦!

创建一个新的,记得帮它makeKeyAndVisible即可:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window makeKeyAndVisible];





“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值