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;
    }

运行结果如下图:


UIWindow*window 获取的4种方法 异同点_第1张图片

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

你可能感兴趣的:(UIWindow*window 获取的4种方法 异同点)