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介绍

    简介 UIWindow 是最顶层的界面容器,下面介绍一些关于它的使用技巧在iOS App中,UIWindow是最顶...

  • XCode7 && iOS 9的一些注意事项

    UIWindows在设置rootViewController之前不能做太多复杂处理,否则无法编译通过,会报"Ass...

  • Runtime介绍---术语介绍

    1. 什么是Runtime Runtime又叫运行时,是一套C语言的API。 我们平时编写的OC代码,底层都是基于...

  • 介绍

    万物终有一天会消失殆尽,诸神出卖黎明,光明为黑暗所湮灭,日月皆痕,海潮鸣泣,幼雏嚎啕,生灵涂炭。 托里奥世纪第20...

  • 介绍😊

    大家好,我是beth,初入简书,不邀自来,还请各位见谅! 先说说我是怎么想着来的吧?这不是刚过了一个寒假嘛...

  • 介绍

    在这个世界上还有三个家族他们不受各个国家联合国管。但他们身上有着使命分别是帝国家族曲国家族圣国家族。他们隐藏在一个...

  • 介绍

    云轩:主角,星罗帝国的二皇子。从小就不能练气,被人们称为废物。直到12岁的时候,自己的武魂觉醒才能练气,双...

  • 介绍

    万花阁 神秘至极的组织,亦正亦邪。万花阁的人行动隐秘,至今未被发现所在地。听说组成成员均以花来命名。所到之处,皆留...

  • 介绍

    此书命曰元.八洲传。属九洲四传第二部。第一部,上古往事。上古往事乃元八洲传外传。前两部为战胜心魔,而第三部,大梦...

  • 介绍

    千肆篇 7月的天气燥热,但在红杏阁里这份燥热就别有一番风味。漫天的胭脂水粉的香味变成了调味剂,女人们千姿百媚,在...

网友评论

    本文标题:UIWindows介绍

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