幕后英雄UIWindow
来源:互联网 发布:新点招投标制作软件 编辑:程序博客网 时间:2024/05/16 19:08
先看一段摘抄的代码
UIWindow*window = [UIApplication sharedApplication].keyWindow; self.frame =window.bounds; [windowaddSubview:self];
看着很神奇,不是吗?居然可以直接往UIWindow上添加view,有点黑魔法的感觉。UIWindow究竟是什么,如何使用,我们一起往下看来自iOS官方的解释。
每个iOS应用必须包含一个window用于展示应用的交互页面。虽然window的作用非常关键,大多数情况下,开发者不需要和它打交道。只有在应用支持显示到外部屏幕的情况,我们才会使用到window。
概要:
在iOS中,window包含了视图,并且负责管理视图在设备上的展示。与window相关的screen则代表了特定设备的显示屏。如果你的应用支持用户将视图投射到外部显示屏幕上的话,你就需要另外创建一个window用于展示内容。
重要概念:
1,UIWindow类是UIView的子类,可以看作是特殊的UIView。
2,一般应用程序只有一个UIWindow对象。
3,即使有多个UIWindow对象,也只有一个UIWindow可以接受到用户的触屏事件。
Window的重要作用:
作用1,window包含了应用的可视区域;
作用2,window负责接收触摸事件,然后分发给各个视图;
作用3,window负责接收横竖屏的变化,然后分发给各个视图。
关于window的创建:
1,一个应用至少包含一个window;
2,在没有storyboard的时代,我们必须在进入应用时创建一个window,并为其关联一个rootviewcontroller。关联上后,window会自动add其视图,并且计算合适展示尺寸。展示的尺寸受到几个因素的影响:状态栏是否可见,当前设备的横竖屏情况,以及视图是否是全屏显示。代码如下:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; myViewController = [[MyViewController alloc] init]; window.rootViewController = myViewController; [window makeKeyAndVisible]; return YES; }
3,在storyboard的时代,主storyboard会自动创建一个window,默默的为我们事。
创建另一个window唯一目的是,用于支持显示到外部屏幕上:
如果你的应用支持外部显示屏幕,你需要额外创建一个window用于暂时内容。你可以在外部显示屏幕上显示同样内容-称作为“镜像”,也是默认会发生的情况;当然你也可以展示不同的内容。
某些事件只会发送给主window:
只有主window才能接收键盘事件,以及非触摸的事件。同一时刻只能有一个主window。触摸事件一定会被分发给被触摸的window,但是不带坐标值之类的事件,只会发送给主window。
绝大多数情况下,承载应用内容的窗口就是主窗口。但在弹出警告视图或弹出式输入视图时,它们就成为了主窗口。
其他参考资料
关于window的具体使用:如何创建和销毁window?如何读取window?window的层级,高层级会覆盖在低层级上?设置主window?window在隐藏,显示,被覆盖,或被设置为主window时会发出特定通知,如果需要对其处理,可以注册监听感兴趣的通知。请见以下两篇文章,我就不做搬运工了。
http://blog.csdn.net/chengyingzhilian/article/details/7872096
http://www.cnblogs.com/wendingding/p/3770052.html
我的总结:
1,Apple的建议是若非要投射到外部显示屏,不需要创建新window。所以,直接创建或使用window是黑魔法。若非必要,不要去操作window。
2,直接从window层面进行操作,可以获取意想不到的方便和效果。感兴趣的同学,可以在工程了搜索以下哪些第三方代码里用到这个黑魔法。
3,一定要记住:window其实是uiview的子类。
学的越多,做的越快;学的越多,做的越好。
- 幕后英雄UIWindow
- Coherence-英雄联盟的幕后英雄
- 幕后英雄网络监控软件
- PLM:英业达的幕后英雄
- 十一、幕后的英雄---风险投资
- Android中的幕后英雄Service
- KDE幕后英雄安东尼奥·拉罗萨访谈
- .NET中的幕后英雄:MSCOREE.DLL
- .NET中的幕后英雄:MSCOREE.DLL
- .NET中的幕后英雄:MSCOREE.DLL
- .NET中的幕后英雄:MSCOREE.DLL
- .NET中的幕后英雄:MSCOREE.DLL
- .NET中的幕后英雄:MSCOREE.DLL
- .NET中的幕后英雄:MSCOREE.DLL
- .NET中的幕后英雄:MSCOREE.DLL
- .NET中的幕后英雄:MSCOREE.DLL
- .NET中的幕后英雄:MSCOREE.DLL
- .NET中的幕后英雄:MSCOREE.DLL
- 字符串的反转及用功能实现
- [IOS]今天开始学UI---UIDatePicker
- fragment findViewById()返回null完全解析
- 软件开发(ERP,APP,游戏)的思考及参考资料
- codeforces 540D D. Bad Luck Island( 概率dp)
- 幕后英雄UIWindow
- 完成端口(Completion Port)详解
- HDU1.3.6 Rank
- python urllib2, urllib使用
- 组合数专题
- Unity Xcode "RegisterMonoModules.o"
- solr4的solr-ik插件
- 文档、视图和框架:分割窗口
- appium Bootstrap UiSelectorParser源码分析