iOS开发之XCode学习:UIWindow对象

作者: iOS 发布时间: 2021-01-27 浏览: 1520 次 编辑

iOS开发之XCode学习:UIWindow对象

学习总结:

  • 重点:UIWindow的基本概念
  • 难点:UIWindow和UIView的关系

源码链接地址:https://pan.baidu.com/s/1yrOLXZZeu9MiOWtMq5-EGA 密码:7t1l

===========================ViewController.m脚本==============================

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

 

//当框架初始化成功后

//调用此函数

//此函数用来初始化整个程序框架结构

//整个程序对ios开发工程时的入口函数

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Override point for customization after application launch.

    

    //创建一个UIWindow对象

    //整个程序中只有一个UIWindow对象

    //在程序级别上表示屏幕窗口

    //UIWindow也是继承于UIview

    //UIWindow是一个特殊的UIView

    //UIScreen:表示屏幕硬件表示类

    //mainScreen获得主屏幕设备信息

    //bounds表示屏幕的宽高值

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    

    //创建一个视图控制器作为UIWindow的根视图控制器

    self.window.rootViewController = [[UIViewController alloc] init];

    

    //设置背景颜色

    self.window.backgroundColor = [UIColor blueColor];

    

    UIView* view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 150, 150)];

    view.backgroundColor = [UIColor orangeColor];

    

    //背景视图

    UIView* backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 240, 360)];

    backView.backgroundColor = [UIColor greenColor];

    //将backView作为view的父亲视图

    //子视图的坐标是参照父亲视图的坐标系

    //当父亲视图移动时,所有的字视图都会跟着动

    [backView addSubview:view];

    [self.window addSubview:backView];    

    //每一个view都有一个window属性

    //view.window;

    

    //使window有效并显示到屏幕上

    [self.window makeKeyAndVisible];

    

    NSLog(@"%@",view.window);

    NSLog(@"%@",backView.window);

    NSLog(@"%@",self.window);

    

    return YES;

} 

运行打印内容如下:

2018-03-05 15:35:04.703268+0800 UIWindow[1307:60413] <UIWindow: 0x7fd370407cd0; frame = (0 0; 414 736); gestureRecognizers = <NSArray: 0x6040002572e0>; layer = <UIWindowLayer: 0x604000039a20>>
2018-03-05 15:35:04.703486+0800 UIWindow[1307:60413] <UIWindow: 0x7fd370407cd0; frame = (0 0; 414 736); gestureRecognizers = <NSArray: 0x6040002572e0>; layer = <UIWindowLayer: 0x604000039a20>>
2018-03-05 15:35:04.703655+0800 UIWindow[1307:60413] <UIWindow: 0x7fd370407cd0; frame = (0 0; 414 736); gestureRecognizers = <NSArray: 0x6040002572e0>; layer = <UIWindowLayer: 0x604000039a20>>

可见,3个window对象其实是同一个。backView.window作为view.window的父对象,self.window作为backView.window的父对象,当self.window被创建出来后,就是唯一的,整个程序中只有一个UIWindow对象,当把子视图添加到父视图上时,譬如把backView添加到self.window上,就会把self.window作为backView的window属性赋值,也就是把父视图的window属性赋给子视图的window属性赋值,以致所有的window对象都是一样的。

附上UIWindow的关系图:一般情况下,UIWindow不与UIView直接产生联系,而是通过View Controller与UIView直接产生联系。