zoukankan      html  css  js  c++  java
  • UIWindow & UIWindowLevel笔记


    一、UIWindow是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里面。UIWindow在程序中主要起到三个作用:

      1、作为容器,包含app所要显示的所有视图

      2、传递触摸消息到程序中view和其他对象

      3、与UIViewController协同工作,方便完成设备方向旋转的支持

    二、通常我们可以采取两种方法将view添加到UIWindow中:

      1、addSubview

      直接将view通过addSubview方式添加到window中,程序负责维护view的生命周期以及刷新,但是并不会为去理会view对应的ViewController,因此采用这种方法将view添加到window以后,我们还要保持view对应的ViewController的有效性,不能过早释放。

      2、rootViewController

      rootViewController时UIWindow的一个遍历方法,通过设置该属性为要添加view对应的ViewController,UIWindow将会自动将其view添加到当前window中,同时负责ViewController和view的生命周期的维护,防止其过早释放

    三、WindowLevel

      UIWindow在显示的时候会根据UIWindowLevel进行排序的,即Level高的将排在所有Level比他低的层级的前面。下面我们来看UIWindowLevel的定义:

        const UIWindowLevel UIWindowLevelNormal;
        const UIWindowLevel UIWindowLevelAlert;
        const UIWindowLevel UIWindowLevelStatusBar;
        typedef CGFloat UIWindowLevel;

      IOS系统中定义了三个window层级,其中每一个层级又可以分好多子层级(从UIWindow的头文件中可以看到成员变量CGFloat _windowSublevel;),不过系统并没有把则个属性开出来。UIWindow的默认级别是UIWindowLevelNormal,我们打印输出这三个level的值分别如下:

    2012-03-27 22:46:08.752 UIViewSample[395:f803] Normal window level: 0.000000
    2012-03-27 22:46:08.754 UIViewSample[395:f803] Alert window level: 2000.000000
    2012-03-27 22:46:08.755 UIViewSample[395:f803] Status window level: 1000.000000

      这样印证了他们级别的高低顺序从小到大为Normal < StatusBar < Alert,下面请看小的测试代码:

    复制代码
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        self.window.backgroundColor = [UIColor yellowColor];
        [self.window makeKeyAndVisible];
        
        UIWindow *normalWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        normalWindow.backgroundColor = [UIColor blueColor];
        normalWindow.windowLevel = UIWindowLevelNormal;
        [normalWindow makeKeyAndVisible];
        
        CGRect windowRect = CGRectMake(50,
                                       50,
                                       [[UIScreen mainScreen] bounds].size.width - 100,
                                       [[UIScreen mainScreen] bounds].size.height - 100);
        UIWindow *alertLevelWindow = [[UIWindow alloc] initWithFrame:windowRect];
        alertLevelWindow.windowLevel = UIWindowLevelAlert;
        alertLevelWindow.backgroundColor = [UIColor redColor];
        [alertLevelWindow makeKeyAndVisible];
        
        UIWindow *statusLevelWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 50, 320, 20)];
        statusLevelWindow.windowLevel = UIWindowLevelStatusBar;
        statusLevelWindow.backgroundColor = [UIColor blackColor];
        [statusLevelWindow makeKeyAndVisible];
        
        NSLog(@"Normal window level: %f", UIWindowLevelNormal);
        NSLog(@"Alert window level: %f", UIWindowLevelAlert);
        NSLog(@"Status window level: %f", UIWindowLevelStatusBar);
        
        return YES;
    }
    复制代码

     

      运行结果如下图:

      我们可以注意到两点:

      1)我们生成的normalWindow虽然是在第一个默认的window之后调用makeKeyAndVisible,但是仍然没有显示出来。这说明当Level层级相同的时候,只有第一个设置为KeyWindow的显示出来,后面同级的再设置KeyWindow也不会显示。

      2)statusLevelWindow在alertLevelWindow之后调用makeKeyAndVisible,仍然只是显示在alertLevelWindow的下方。这说明UIWindow在显示的时候是不管KeyWindow是谁,都是Level优先的,即Level最高的始终显示在最前面。

      那么如何才能将后加的同一层级的window显示出来呢?

      思考中......

     转载自:http://www.cnblogs.com/smileEvday/archive/2012/03/27/2420362.html


  • 相关阅读:
    ZOJ 3818 Pretty Poem
    HDU 4597 Play Game
    HDU 4497 GCD and LCM
    CSU 1335 高桥和低桥
    UVA 10791 Minimum Sum LCM
    CSU 1119 Collecting Coins
    CSU 1120 病毒
    UVA 12169 Disgruntled Judge
    HDU 1301 Jungle Roads
    POJ 1258 Agri-Net
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879538.html
Copyright © 2011-2022 走看看