UI-Day01--UIWindow & UIWindowLevel(四)

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] Normal window level: 2000.000000

2012-03-27 22:46:08.755 UIViewSample[395:f803] Normal window level: 1000.000000

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

TestWindowLevel

 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 2
 3 {
 4
 5     self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
 6
 7     self.window.backgroundColor = [UIColor yellowColor];
 8
 9     [self.window makeKeyAndVisible];
10
11
12
13     UIWindow *normalWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
14
15     normalWindow.backgroundColor = [UIColor blueColor];
16
17     normalWindow.windowLevel = UIWindowLevelNormal;
18
19     [normalWindow makeKeyAndVisible];
20
21
22
23     CGRect windowRect = CGRectMake(50,
24
25                                    50,
26
27                                    [[UIScreen mainScreen] bounds].size.width - 100,
28
29                                    [[UIScreen mainScreen] bounds].size.height - 100);
30
31     UIWindow *alertLevelWindow = [[UIWindow alloc] initWithFrame:windowRect];
32
33     alertLevelWindow.windowLevel = UIWindowLevelAlert;
34
35     alertLevelWindow.backgroundColor = [UIColor redColor];
36
37     [alertLevelWindow makeKeyAndVisible];
38
39
40
41     UIWindow *statusLevelWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 50, 320, 20)];
42
43     statusLevelWindow.windowLevel = UIWindowLevelStatusBar;
44
45     statusLevelWindow.backgroundColor = [UIColor blackColor];
46
47     [statusLevelWindow makeKeyAndVisible];
48
49
50
51     NSLog(@"Normal window level: %f", UIWindowLevelNormal);
52
53     NSLog(@"Normal window level: %f", UIWindowLevelAlert);
54
55     NSLog(@"Normal window level: %f", UIWindowLevelStatusBar);
56
57
58
59     return YES;
60
61 }

 

  我们可以注意到两点:

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

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

二、区别

1、UIScreen可以获取设备屏幕的大小。

 2
7
18  整个屏幕的大小 {{0, 0}, {320, 480}}
19
20 CGRect
21
22  bounds = [UIScreen mainScreen].bounds;
23
24 NSLog(@"UIScreen
25
26  bounds: %@",
27
28  NSStringFromCGRect(bounds));
29
30
31
32 //
33
34  应用程序窗口大小 {{0, 20}, {320, 460}}
35
36 CGRect
37
38  applicationFrame = [UIScreen mainScreen].applicationFrame;
39
40 NSLog(@"UIScreen
41
42  applicationFrame: %@",
43
44  NSStringFromCGRect(applicationFrame));
   

2、UIView对象定义了一个屏幕上的一个矩形区域,同时处理该区域的绘制和触屏事件。?可以在这个区域内绘制图形和文字,还可以接收用户的操作。一个UIView的实例可以包含和管理若干个子UIView。

ViewController.m


1

2

3

4

5

6

7


-

(void)viewDidAppear:(BOOL)animated

{

[super

viewDidAppear:animated];

UIView*

myView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)];

myView.backgroundColor=[UIColor

redColor];

[self.view

addSubview:myView];

}

3、UIWindow对象是所有UIView的根,管理和协调的应用程序的显示?UIWindow类是UIView的子类,可以看作是特殊的UIView。一般应用程序只有一个UIWindow对象,即使有多个UIWindow对象,也只有一个UIWindow可以接受到用户的触屏事件。

AppDelegate.m


1

2

3

4

5

6

7

8


-

(BOOL)application:(UIApplication

*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

UIWindow

*myWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

myWindow.backgroundColor=[UIColor

whiteColor];

[myWindow

makeKeyAndVisible];

_window

= myWindow;

return

YES;

}

4、UIViewController对象负责管理所有UIView的层次结构,并响应设备的方向变化。

AppDelegate.m


1

2

3

4

5

6

7

8

9

10


-

(BOOL)application:(UIApplication

*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

UIWindow

*myWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

myWindow.backgroundColor=[UIColor

whiteColor];

UIViewController

*myViewController = [[UIViewController alloc] initWithNibName:nil bundle:nil];

myWindow.rootViewController

= myViewController;

[myWindow

makeKeyAndVisible];

_window

= myWindow;

return

YES;

}

三、完整的代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51


//

ViewController.h

#import

<UIKit/UIKit.h>

@interface

ViewController : UIViewController

@end

//

ViewController.m

#import

"ViewController.h"

@implementation

ViewController

-

(void)viewDidAppear:(BOOL)animated

{

[super

viewDidAppear:animated];

UIView*

myView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 100, 50)];

myView.backgroundColor=[UIColor

redColor];

[self.view

addSubview:myView];

}

-

(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

return

YES;

}

@end

//

AppDelegate.h

#import

<UIKit/UIKit.h>

@class

ViewController;

@interface

AppDelegate : UIResponder <UIApplicationDelegate>

@property

(strong, nonatomic) UIWindow *window;

@property

(strong, nonatomic) ViewController *viewController;

@end

//

AppDelegate.m

#import

"AppDelegate.h"

#import

"ViewController.h"

@implementation

AppDelegate

@synthesize

window = _window;

@synthesize

viewController = _viewController;

-

(BOOL)application:(UIApplication

*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

self.window

= [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

self.viewController

= [[ViewController alloc] initWithNibName:nil bundle:nil];

self.window.rootViewController

= self.viewController;

[self.window

makeKeyAndVisible];

return

YES;

}

@end

//

main.m

#import

<UIKit/UIKit.h>

#import

"AppDelegate.h"

int

main(int

argc, char

*argv[]) {

@autoreleasepool

{

return

UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

}

}

时间: 2024-12-28 20:26:16

UI-Day01--UIWindow & UIWindowLevel(四)的相关文章

iOS开发UI篇-UIWindow简单介绍

iOS开发UI篇—UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow.也就说,没有UIWindow,就看不见任何UI界面 补充:UIWindow是创建的第一个视图控件(创建的第一个

iOS开发UI篇—UIWindow简单介绍

iOS开发UI篇—UIWindow简单介绍 - 文顶顶 - 博客园 文顶顶 iOS开发UI篇—UIWindow简单介绍 iOS开发UI篇—UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWi

UI学习笔记---第四天

事件处理 事件概述 UIEvent:事件,是由硬件捕捉的一个表示用户操作设备的对象 分三类:触摸事件\  晃动事件\ 远程控制事件 触摸事件:会包含1个到多个触摸点 实现触摸 UIView支持触摸事件(因为继承于UIResponder),而且支持多点触摸 需要定义UIView子类,实现触摸相关的方法 touches..begin     touches..moved    touches..ended     touches..canceled UI学习笔记---第四天

UI标签库专题四:JEECG智能开发平台 Upload(上传标签)

?? 1. Upload(上传标签) 1.1.  参数 属性名 类型 描述 是否必须 默认值 id string 上传控件唯一标示 是 null name string 控件name 是 null formData string 上传文件提交后台的其他表单参数取ID 否 null uploader string 上传提交路径 是 null extend string 上传文件扩展名(可选类型组1,pic[*.jpg;*,jpeg;*.png;*.gif;*.bmp;*.ico;*.tif],2,

iOS开发UI篇—UIWindow简单介绍 - 文顶顶

一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow.也就说,没有UIWindow,就看不见任何UI界面 补充:UIWindow是创建的第一个视图控件(创建的第一个对象是UIapplication)如下图:

(转摘+修改) 深入理解 UIWindow &amp; UIWindowLevel

转载于: http://www.cnblogs.com/smileEvday/archive/2012/03/27/2420362.html 一.UIWindow是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里面.UIWindow在程序中主要起到三个作用: 1.作为容器,包含app所要显示的所有视图 2.传递触摸消息到程序中view和其他对象 3.与UIViewController协同工作,方便完成设备方向旋转的支持 二.通

产品UI设计排版的四个基本原则

相信很多初学UI设计的设计师,或者一些刚一边从事UI设计岗位,一边学习UI的,刚开始的时候都会遇到UI设计的规范,下面介绍四个基础的UI设计原则. 一.轴 轴在UI设计中是最基本.最常见的概念,也是用来组织界面结构的重要核心.简单说来,轴是在设计的时候组织一系列元素的假象线,在下面的设计图中,轴以虚线的方式被标注出来. 1.对齐 轴最常见于对称元素的使用,当元素被布置成轴对称的布局的时候,会给人有序感.就像生活中绝大多数的事情一样,我们更倾向于享受有序的的东西,它们令人感觉平稳.舒适.平易近人.

UIWindow &amp; UIWindowLevel详解

一.UIWindow是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里面.UIWindow在程序中主要起到三个作用: 1.作为容器,包含app所要显示的所有视图 2.传递触摸消息到程序中view和其他对象 3.与UIViewController协同工作,方便完成设备方向旋转的支持 二.通常我们可以采取两种方法将view添加到UIWindow中: 1.addSubview 直接将view通过addSubview方式添加到wind

Android UI开发第二十四篇——Action Bar

Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为action bar能够使应用程序给用户提供一致的界面,并且系统能够很好根据不同的屏幕配置来适应操作栏的外观.你能够用ActionBar的对象的API来控制操作栏的行为和可见性,这些API被添加在Android3.0(API 级别 11)中. Action bar的主要目的是: 1.  提供一个用于识别应用

IOS开发——UI进阶篇(四)全局刷新,局部刷新,左滑操作,左滑出现更多按钮,进入编辑模式,批量删除,自定义批量删除

首先创建项目,在storyboard如下布局控件,设置好约束 然后创建cell模型类XMGWineCell数据模型类XMGWine创建UITableView,设置数据源协议,实现数据源方法懒加载数据这些在前面已经做过很多次了,代码就不一一写了 一.全局刷新 1.添加单组数据并全局刷新 - (IBAction)add { // 添加模型数据 XMGWine *wine = [[XMGWine alloc] init]; wine.money = @"20.5"; wine.name =