UIWindow简介
之前一直没理解AppDelegate里面的强引用UIWindow是什么东西,后来慢慢了解了UIWindow一些知识。
UIWindow继承自UIView,是一个特殊的UIView,我们一般不会直接去设置其UI展现形式,但它对展现程序中的views至关重要。每一个view,想要出现在屏幕上都依赖于window,但是程序中的window之间是相互独立的。应用程序收到事件之后会先转发给适当的window对象,从而又将事件转发给view对象。
以上简介摘自:
作者:ripperhe
链接:http://www.jianshu.com/p/98cd7fc4bfba
1, KeyWindow
KeyWindow是每一个App的主显示窗口,每个App有且只有一个KeyWindow,但是可以有多个UIWindow对象。
常见的纯代码创建AppDelegate的UIWindow
self.window = [[UIWindow alloc] init];
self.window.frame = [UIScreen mainScreen].bounds;
ViewController *vc =[[ViewController alloc] init];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
需要主要的是代码中的window需要强引用,不然代码已执行完就直接释放了。
2,其他的UIWindow
App中可以创建多个UIWindow对象,常见的有:
1,stutasWindow:用于管理状态栏
2,输入键盘window:(UITextEffectsWindow,UIRemoteKeyboardWindow)用户管理键盘输入
查看window的方法
[UIApplication sharedApplication].keyWindow;
[UIApplication sharedApplication].windows;
self.view.window;
3,UIWindow的等级属性
windowLevel显示等级,等级越高越在上面,分别为:
UIWindowLevelNormal 0.000000
UIWindowLevelAlert 2000.000000
UIWindowLevelStatusBar 1000.000000
所以我们通常可以看到状态栏的窗口可以一直悬浮在其他界面之上。
4,创建UIWindow
创建UIWindow无需addSubbiew 到view上面,系统会自动添加都屏幕上。
dispatch_async(dispatch_get_main_queue(), ^{
UIWindow *myWindow = [[UIWindow alloc] init];
self.myWindow = myWindow;
myWindow.windowLevel = UIWindowLevelAlert;
myWindow.backgroundColor = [UIColor redColor];
myWindow.frame = CGRectMake(30, 30, 30, 30);
myWindow.hidden = NO;
});
常用异步是因为防止还没有创建rootViewController的时候报错,或者采用延时创建亦可,UIWindow的hidden默认为YES,要改为NO方能显示。
5,常用UIWindow案例
1,点击状态栏将UISrollView回滚到顶部
实现的原理是在状态栏处添加了一个UIWindow, 并且该window的等级属性高于UIWindowLevelStatusBar ,可取为UIWindowLevelAlert,设置背景颜色为透明。
参考代码:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
window_ = [[UIWindow alloc] init];
window_.windowLevel = UIWindowLevelAlert;
window_.frame = [UIApplication sharedApplication].statusBarFrame;
window_.backgroundColor = [UIColor clearColor];
window_.hidden = NO;
[window_ addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(windowClick)]];
});
2,蒙层添加到最上层
有时候,创建UIView灰色的蒙层会被UINaviBar或者UITabBar挡住,这时可将蒙层添加到controller.view.window上,可实现蒙层处于最上层,但是值得注意的是,controller.view.window要在viewDidLayoutSubviews函数之后才会赋值。
3,广告页面
从后台拉起程序的时候,显示广告页面,可以利用UIWindow实现