分析UIWindow
转载自:http://www.cnblogs.com/YouXianMing/p/3811741.html
The UIWindow class defines an object known as a window that manages and coordinates the views an app displays on a device screen. Unless an app can display content on an external device screen, an app has only one window.
UIWindow定义了一个对象,用来管理视图的坐标系统,除非,app可以在另外一个窗口里面展示内容,否则,一个app只有一个window.
每一个controller都会被UIWindow接管,UIWindow一次只能接管一个controller,下面用代码验证.
首先,我们来看看,UIWindow何时接管了controller.
请写以下代码:

//
// RootViewController.m
// Window
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "RootViewController.h" @interface RootViewController () @end @implementation RootViewController - (void)viewDidLoad
{
[super viewDidLoad]; if (self.view.window)
{
NSLog(@"viewDidLoad");
NSLog(@"%@", NSStringFromCGRect(self.view.window.frame));
}
} - (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated]; if (self.view.window)
{
NSLog(@"viewWillAppear");
NSLog(@"%@", NSStringFromCGRect(self.view.window.frame));
}
} - (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated]; if (self.view.window)
{
NSLog(@"viewDidAppear");
NSLog(@"%@", NSStringFromCGRect(self.view.window.frame));
}
} - (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated]; if (self.view.window)
{
NSLog(@"viewWillDisappear");
NSLog(@"%@", NSStringFromCGRect(self.view.window.frame));
}
} - (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated]; if (self.view.window)
{
NSLog(@"viewDidDisappear");
NSLog(@"%@", NSStringFromCGRect(self.view.window.frame));
}
} @end

打印信息,注意哦,UIWindow会在一个controller的viewDidAppear方法中才接管了当前controller,而不是在ViewDidLoad方法中,注意:)

接下来,我们在导航栏控制器间切换,来观察,UIWindow如何放弃一个controller然后接管另外一个controller

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
UINavigationController *NC = \
[[UINavigationController alloc] initWithRootViewController:[RootViewController new]]; self.window.rootViewController = NC; self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}


//
// RootViewController.m
// Window
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "RootViewController.h"
#import "SecondViewController.h"
#import "YXGCD.h" @interface RootViewController () @end @implementation RootViewController - (void)viewDidLoad
{
[super viewDidLoad]; if (self.view.window)
{
NSLog(@"viewDidLoad");
NSLog(@"%@", NSStringFromCGRect(self.view.window.frame));
} [[GCDQueue mainQueue] execute:^{
[self.navigationController pushViewController:[SecondViewController new]
animated:YES];
} afterDelay:NSEC_PER_SEC * 4];
} - (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated]; if (self.view.window)
{
NSLog(@"viewWillAppear");
NSLog(@"%@", NSStringFromCGRect(self.view.window.frame));
}
} - (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated]; if (self.view.window)
{
NSLog(@"viewDidAppear");
NSLog(@"%@", NSStringFromCGRect(self.view.window.frame));
}
} - (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated]; if (self.view.window)
{
NSLog(@"viewWillDisappear");
NSLog(@"%@", NSStringFromCGRect(self.view.window.frame));
}
} - (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated]; if (self.view.window)
{
NSLog(@"viewDidDisappear");
NSLog(@"%@", NSStringFromCGRect(self.view.window.frame));
}
} @end


//
// SecondViewController.m
// Window
//// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "SecondViewController.h" @interface SecondViewController () @end @implementation SecondViewController - (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
} @end

查看结果:

结论很自然,一个UIWindow只能在接管一个controller.
为什么要纠结于UIWindow的这些小细节呢?因为,UIWindow有着比一切controller都要高的优先级显示权利,加载在UIWindow上面的View是不会被遮挡住的.
效果(注意查看上面的导航条的地方,也被遮盖住了):

源码:

//
// RootViewController.m
// Window
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "RootViewController.h"
#import "YXGCD.h" @interface RootViewController () @end @implementation RootViewController - (void)viewDidLoad
{
[super viewDidLoad]; [[GCDQueue mainQueue] execute:^{ UIView *redView = [[UIView alloc] initWithFrame:self.view.window.frame];
redView.backgroundColor = [UIColor redColor];
redView.alpha = 0.f;
[self.view.window addSubview:redView]; [UIView animateWithDuration:1 animations:^{
redView.alpha = 1.f;
} completion:^(BOOL finished) { [UIView animateWithDuration:1 animations:^{
redView.alpha = 0.f;
} completion:^(BOOL finished) {
[redView removeFromSuperview];
}];
}]; } afterDelay:NSEC_PER_SEC * 10];
} @end

普通的View的加载的效果(注意上方的导航栏,它并没有变成红色):


//
// RootViewController.m
// Window
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "RootViewController.h"
#import "YXGCD.h" @interface RootViewController () @end @implementation RootViewController - (void)viewDidLoad
{
[super viewDidLoad]; [[GCDQueue mainQueue] execute:^{ UIView *redView = [[UIView alloc] initWithFrame:self.view.window.frame];
redView.backgroundColor = [UIColor redColor];
redView.alpha = 0.f;
[self.view addSubview:redView]; [UIView animateWithDuration:1 animations:^{
redView.alpha = 1.f;
} completion:^(BOOL finished) { [UIView animateWithDuration:1 animations:^{
redView.alpha = 0.f;
} completion:^(BOOL finished) {
[redView removeFromSuperview];
}];
}]; } afterDelay:NSEC_PER_SEC * 10];
} @end


其实呢,你如果写成这样子,也是可以遮盖导航条的呢:

其实,就这么多东西:)
分析UIWindow的更多相关文章
- 【转】iOS应用崩溃日志分析
作为一名应用开发者,你是否有过如下经历? 为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! ...
- iOS 第三方自定义Alertview项目MBProcessHud中的重要代码分析
做ios,弹出一个自定义的alertview挺常见的.ios7以前,我们可以对系统的UIAlertView进行一点操作,实现一点简单的定制,但是ios7不再允许我们这样做了.因此,我们需要自己创建一个 ...
- UIWindow 详解
UIWindow对象是所有UIView的根视图,管理和协调的应用程序的显示.分发事件给View.UIWindow类是UIView的子类,可以看作是特殊的UIView.一般应用程序只有一个UIWindo ...
- cocos2D(三)---- 第一cocos2d的程序代码分析
在第一讲中已经新建了第一个cocos2d程序,执行效果例如以下: 在这讲中我们来分析下里面的代码,了解cocos2d的工作原理,看看屏幕上的这个"Hello World"是怎样显示 ...
- IOS计划 分析
1.基本介绍 IOS苹果公司iPhone.iPod touch和iPad操作系统和其他设备的发展. 2.知识点 1.IOS系统 iPhone OS(现在所谓的iOS)这是iPhone, iPod to ...
- [转]MBProgressHUD 源码分析
源码来源: https://github.com/jdg/MBProgressHUD 版本:0.9.1 MBProgressHUD是一个显示HUD窗口的第三方类库,用于在执行一些后台任务时,在程序中显 ...
- JDiPad项目runtime的使用分析
首先,项目有点老 但是运行还是没有问题的.其中很多地方到了runtime,同时也看到了 早期的开发人员 基本没用pod 第三方也很少用,除了微信登录,整个项目还没看到集成的第三方SDK.然后慢慢梳理 ...
- 三、第一个cocos2d程序的代码分析
http://blog.csdn.net/q199109106q/article/details/8591706 在第一讲中已经新建了第一个cocos2d程序,运行效果如下: 在这讲中我们来分析下里面 ...
- iOS应用崩溃日志分析 iOS应用崩溃日志揭秘
转自:http://www.raywenderlich.com/zh-hans/30818/ios%E5%BA%94%E7%94%A8%E5%B4%A9%E6%BA%83%E6%97%A5%E5%BF ...
随机推荐
- HDU 5765 Bonds
比赛时候想了好久,不会.看了官方题解才会...... Bond是极小割边集合,去掉一个Bond之后,只会将原图分成两个连通块. 假设某些点构成的集合为 s(点集中的点进行状压后得到的一个十进制数),那 ...
- 多个git账户生成多份rsa秘钥实现多个账户同时使用配置
下文分享一个多个git账户生成多份rsa秘钥实现多个账户同时使用配置例子了,这个例子非常的好用对于有多个git的朋友有不小的帮助. 使用过git的童鞋应该对id_rsa秘钥不陌生,总得用github吧 ...
- Bitcode问题
原因:Xcode7 及以上版本会默认开启 bitcode .bitcode具体是什么就不解释了.解决方法:1.更新library使包含Bitcode,否则会出现以上的警告.2.关闭Bitcode,简单 ...
- [转]关于Socket粘包问题
这两天看csdn有一些关于socket粘包,socket缓冲区设置的问题,发现自己不是很清楚,所以查资料了解记录一下: 一两个简单概念长连接与短连接:1.长连接 Client方与Server方先建立通 ...
- 客户端 HttpUtils.java
package com.http.post; import java.io.ByteArrayOutputStream; import java.io.IOException; import java ...
- PHP实现队列的原理
关于的队列的介绍,我这里就不多讲了,随便百度一下都很多 用过laravel框架的童鞋都知道其自带队列功能,之前我很费解,PHP只是一个脚本,有超时机制 为什么能不停的去执行队列呢? 带着这个问题,在网 ...
- IOS 中常用站位符
CGPoint.CGRect等可以转化为字符串打印出来 如: NSLog(@"-------------%@",NSStringFromCGPoint(point)); ...
- UITextfield的一些属性
//设置左视图 不用设置frame UIImageView *imageV = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@&quo ...
- .net ToString()用法详解与格式说明
我们经常会遇到对时间进行转换,达到不同的显示效果,默认格式为:2006-6-6 14:33:34 如果要换成成200606,06-2006,2006-6-6或更多的格式该怎么办呢? 这里将要用到:Da ...
- 【sort】 基数排序
下面这段问答摘自csdn: 把基数排序说成桶排序应该是没有太大问题的.总的说来,应该把这一类归为分配排序,由于分配排序的一些缺陷,主要是时间代价很差,改进成为桶式排序(bucket sort),而桶排 ...