UIWindow*window 获取的4种方法 异同点

UIWindow *window = [[UIApplication sharedApplication]windows].lastObject;
UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIWindow *window = [[UIApplication sharedApplication].delegate window];
UIView *view = [[UIViewalloc]initWithFrame:CGRectMake(100,100,100,100)];
view.backgroundColor= [UIColor redColor];
[window addSubview:view];

UIWindow &&view&&UIViewController&&app开始运行到弹出界面的过程
一、设置主窗口
[self.window makeKeyAndVisible] 让窗口成为主窗口并显示出来(单独对view是没有办法自己显示出来的,必须要依托UIWindow)
[self.window make keyWindow[ 让UIWindow成为主窗口但不显示出来
二、获取UIWindow
①获取视图view的列表数组:[UIApplication sharedApplication].windows (UIApplication指当前应用程序,windows为UIApplication的属性,获取视图列表)
②获取主视图:[UIApplication sharedApplication].keyWindow keyWindows是UIApplication的主视图属性。同时只有当前视图是主视图
③获取某个view所在的UIWindow:view.window
三、窗口创建、视图显示过程
main函数-->UIApplication(argc,argv,nil,NSStringFromClass([AppDelegate class])
(第三个参数是主要类,是UIApplication的子类,nil指的就是UIApplication即当前应用程序;第四个参数是代理类,遵循UIApplicationDelegate,负责控制程序的运行。)
通过这两个参数创建application、创建代理,并把代理设置给application--->调用delegate对象(一般就是APPDelegate)的application:didFinishLaunchingWithOption:方法


接下来分两种情况
①有storyboard时:根据info.plist里面的name(即main nib file base name项),找到对应的storyboard,接下来创建一个window--->>c创建其的控制器(就是箭头指的那个),并自动把这个控制器设置为UIWindow的根控制器。
②没有storyboard时:
调用方法后,创建UIWindow-->创建UIWindow的rootViewController--->显示窗口
注意:第二种方法会更快。方法是删去info.plist中的main nib file base name项,代码如下(通用代码):
-(BOOL)application:(UIApplication) didFinishLaunchingOptions:(NSDictionary)launchOptions
{
self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];//mainScreen获取当前屏幕尺寸;bounds指的是全屏;applicationFrame指的是除了状态栏的全屏;
if([[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPhone)
{
self.viewController=[[viewController alloc]initWithNibName:@"viewController_iPhone" bundle:nil];//创建window
}
else
{
self.viewController=[[viewController alloc[initWithNibName:@"viewController_iPad: bundle:nil];
}
self.window.rootViewController=self.viewController;//设置根控制器
[self.window makeKeyAndVisible];//设置主视图并显示
return YES;
}
(该方法负责controller类的初始化)
在不用判断是iPhone还是iPad时,这个方法可以更加简便:
-(BOOL)application:(UIApplication)didFinishLaunchingOptions:(NSDictionary
)launchOptions
{
self.window=[[UIWindow alloc] initWithFrame:[[UIWindow mainScreen] bounds];
self.window.backgroundColor=[UIColor whiteColor];
self.window.rootViewController=self.viewController;//设置根控制器
[self.window.makeKeyAndVisible];//设置为主窗口并显示
return YES;
}
总的过程就是 创建application--->创建代理--->UIWindow
在上面两段代码中,self.window.rootViewController=self.viewController设置根控制器其实就是将view添加到UIWindow
http://www.it165.net/pro/html/201406/15046.html这里有个图,来自官方文档,十分清晰。UIWindow和view通过根控制器viewController连接
将view添加到UIWindow还有另外一个方法 addSubview --------->[self.window addSubview:self.view];
但是不推荐这种不通过根控制器直接添加view的做法,原因:
①控制器上可能有按钮等点击事件。而控制器是局部变量,若控制器不存在了,而view还存在,会出错;
②若要实现通过屏幕上的按钮控制屏幕旋转,是由根控制器控制旋转的;而第二种方法因为根本没有用根控制器,自然也无法旋转
三、UIApplication
方法sharedApplication:获取应用程序的句柄
属性delegate获取UIApplicationDelegate实现类的实例(一般是APPDelegate)
属性windows获取当前程序涉及到的窗口类数组
属性keywindow获取当前程序的主窗口
UIApplication的其他应用还包括:设置应用图标右上角的红色数字;设置联网指示器的可见性;管理状态栏(需要先修改info.plist);利用openURL:方法实现打电话发短信发邮件打开网页和跳转到其他APP
四、UIApplicationDelegate
其实例化一般就是AppDelegate,负责管理app被打断时,通知代理进入后台
aplplication:didFinshLaunchingWithOptions:程序加载完毕
applicationDidBecameActive:程序获取焦点(可交互)
applicationDidEnterBackground:程序进入后台
applicationDidResignActive:程序失去焦点(不可交互)
applicationWillEnterForeground:程序从后台回到前台
applicationDidReciveMemoryWarning:内存警告,可能要终止程序
applicationWillTerminate:程序即将退出

http://blog.csdn.net/chengyingzhilian/article/details/7872096

一、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的定义:
constUIWindowLevel UIWindowLevelNormal;
constUIWindowLevel UIWindowLevelAlert;
constUIWindowLevel UIWindowLevelStatusBar;
typedef CGFloat UIWindowLevel;
IOS系统中定义了三个window层级,其中每一个层级又可以分好多子层级(从UIWindow的头文件中可以看到成员变量CGFloat_windowSublevel;),不过系统并没有把则个属性开出来。UIWindow的默认级别是UIWindowLevelNormal,我们打印输出这三个level的值分别如下:
[objc]view plaincopy
print?
2012-03-2722:46:08.752UIViewSample[395:f803] Normal windowlevel:0.000000
2012-03-2722:46:08.754UIViewSample[395:f803] Normal windowlevel:2000.000000
2012-03-2722:46:08.755UIViewSample[395:f803] Normal windowlevel:1000.000000
这样印证了他们级别的高低顺序从小到大为Normal < StatusBar < Alert,下面请看小的测试代码:
TestWindowLevel


  • (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(@"Normal window level: %f", UIWindowLevelAlert);
    NSLog(@"Normal window level: %f", UIWindowLevelStatusBar);
    returnYES;
    }

运行结果如下图:


我们可以注意到两点:
1)我们生成的normalWindow虽然是在第一个默认的window之后调用makeKeyAndVisible,但是仍然没有显示出来。这说明当Level层级相同的时候,只有第一个设置为KeyWindow的显示出来,后面同级的再设置KeyWindow也不会显示。
2)statusLevelWindow在alertLevelWindow之后调用makeKeyAndVisible,淡仍然只是显示在alertLevelWindow的下方。这说明UIWindow在显示的时候是不管KeyWindow是谁,都是Level优先的,即Level最高的始终显示在最前面。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容