UIWindows介绍

作者: 下页天 | 来源:发表于2018-10-24 15:45 被阅读8次

    简介

    • 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] 添加控制的弊端

        1. 弱引用,当view发生一些事件的时候,通知控制器,但是控制器已经销毁了,报野指针错误

        2. 屏幕旋转时导航栏和添加控件不能旋转

        原因:事件处理机制:检测事件->UIApplication->UIWindow->rootViewController ,通过[window addSubview] 方式因为没有设置根控制器,所以导航栏和控件接收不到事件

    • 不要滥用UIWindow

    通过创建UIWindow,我们很容易实现将牧歌特定的界面置于最上层的小锅,但是这种特性不应该被滥用,如果弹出界面属于一个ViewController,那么使用ViewController的子控制器来实现

    相关文章

      网友评论

        本文标题:UIWindows介绍

        本文链接:https://www.haomeiwen.com/subject/kbkxtqtx.html