简介
-
UIWindow 是最顶层的界面容器,下面介绍一些关于它的使用技巧
在iOS App中,UIWindow是最顶层的界面内容,我们使用UIWindow和UIView来呈现界面。UIWindow并不包含任何默认的内容,但是它被当作UIView的容器,用于放置应用中所有的UIView。
从继承关系来看,UIWindow继承自UIView,所以UIWindow除了具有UIView的所有功能之外,还增加了一些特有的属性和方法,而我们最常用的方法,就是在App刚启动时,调用UIWindow的makeKeyAndVisible方法,代码如下:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; QSRootViewController *rootVC = [[QSRootViewController alloc]init]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:rootVC]; self.window.backgroundColor = [UIColor whiteColor]; self.window.rootViewController = nav; [self.window makeKeyAndVisible]; //让window成为key window,使得window可见 return YES; }
-
UIWindow的主要作用有
- 作为UIView的最顶层容器,包含应用显示所有的UIView
- 传递触摸消息和键盘事件给UIView
-
为UIWindow增加UIView
- 通过调用addSubView方法;
- 设置其特有的rootViewController属性。设置该属性后,UIWindow会自动将view controller的view添加到当前window中,同时负责维护view controller和view的生命周期。上述在application:didFinishLaunchingWithOptions:中使用的就是这种办法。
-
系统对UIWindow的使用
通常在一个程序中只会有一个UIWindow,但有些时候我们调用系统的控件(例如UIAlertView)时,iOS系统为了保证UIAlertView在所有的界面之上,它会临时创建一个新的UIWindow,通过将其UIWindowLevel设置更高,让UIAlertView盖在所有其他UI之上。
默认程序的UIWindow的层级是UIWindowLevelNormal,当系统需要覆盖在其上覆盖UIAlertView时,就会创建一个层级是UIWindowLevelAlert的UIWindow,因为其windowLevel值更高,所以就覆盖在上面了。 -
手工创建UIWindow
有些时候,我们也希望在应用开发中,将某些界面覆盖在所有界面的最上层。这个时候,我们就可以手工创建一个新的UIWindow。需要注意的是,和创建UIView不同,UIWindow一旦被创建,它就自动地被添加到整个界面上了(当然,其windowLevel要足够高)。
还有一点需要注意的是,如果我们创建的UIWindow需要处理键盘事件,那就需要合理地将其设置为keyWindow。keyWindow是被系统设计用来接收键盘和其他非触摸事件的UIWindow。我们可以通过makeKeyWindow和resignKeyWindow方法设置UIWindow实例的keyWindow与否。
注意
如果我们创建的UIWindow需要处理键盘事件,那就需要合理地将其设置为keyWindow。keyWindow是被系统设计用来接收键盘和其他非触摸事件的UIWindow。我们可以通过makeKeyWindow和resignKeyWindow(在不需要接收键盘时调用)方法设置UIWindow实例的keyWindow。
//默认是 [UIScreen mainScreen],改变屏幕是消息性能的操作,不应该写对性能敏感的代码
@property(nonatomic,retain) UIScreen *screen NS_AVAILABLE_IOS(3_2);
//UIWindow在显示的时候会根据UIWindowLevel进行排序的,即Level高的将排在所有Level比他低的层级的前面。
@property(nonatomic) UIWindowLevel windowLevel; // default = 0.0 即Normal
//是否是主窗口
@property(nonatomic,readonly,getter=isKeyWindow) BOOL keyWindow;
//根控制器
@property(nonatomic,retain) UIViewController *rootViewController NS_AVAILABLE_IOS(4_0); // default is nil
//调用窗口,使成为主窗口
- (void)becomeKeyWindow;
//调用窗口,取消成为主窗口
- (void)resignKeyWindow;
//将当前 UIWindow 设置成应用的 key window,但并不显示
- (void)makeKeyWindow;
//将当前 UIWindow 设置成应用的 key window,并显示
- (void)makeKeyAndVisible;
-
makeKeyAndVisible 和 makeKeyWindow 方法区别
- [self.window makeKeyAndVisible]让窗口成为主窗口,并且显示出来,才能把信息显示到屏幕上。因为Window有makeKeyAndVisible这个方法,可以让这个Window凭空的显示出来,而其他的view没有这个方法,所以它只能依赖于Window,Window显示出来后,view才依附在Window上显示出来。
- [self.window makeKeyWindow]让uiwindow成为主窗口,但不显示。想显示调用self.hidden = false;
- keyWindow 用来接受键盘 非触摸事件,不是keyWindow 就不能接受键盘事件
-
获取UIwindow
- 获取UIWindow列表
[UIApplication sharedApplication].windows // 获取在应用中打开的UIWindow列表,可以获取应用中的任何一个UIView对象,例如 当输入文字时,弹出的键盘就是UIWindow,如果需要改变键盘的样式,则可用更改当前Window
- 获取当前主窗口
[UIApplication sharedApplication].keyWindow //获取应用程序的主窗口,用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。 //注意:如果UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow
- 获取当前view 所在的UIWindow
view.window //获得某个UIView所在的UIWindow
-
addSubview 和 rootViewController 区别
-
[window addSubview:vc.view] 添加控制的弊端
-
弱引用,当view发生一些事件的时候,通知控制器,但是控制器已经销毁了,报野指针错误
-
屏幕旋转时导航栏和添加控件不能旋转
原因:事件处理机制:检测事件->UIApplication->UIWindow->rootViewController ,通过[window addSubview] 方式因为没有设置根控制器,所以导航栏和控件接收不到事件
-
-
-
不要滥用UIWindow
通过创建UIWindow,我们很容易实现将牧歌特定的界面置于最上层的小锅,但是这种特性不应该被滥用,如果弹出界面属于一个ViewController,那么使用ViewController的子控制器来实现
网友评论