UIWindow介绍

来源:互联网 发布:软件操作说明书模板 编辑:程序博客网 时间:2024/05/17 00:10


先从下图上直观的了解一下:

概述

窗口和视图是为iPhone应用程序构造用户界面的可视组件。窗口为内容显示提供背景平台,而视图负责绝大部分的内容描画,并负责响应用户的交互。虽然本章讨论的概念和窗口及视图都相关联,但是讨论过程更加关注视图,因为视图对系统更为重要。

窗口是视图的一个子类。窗口的主要功能:一是提供一个区域来显示视图,二是将事件(event)分发给视图(请参考本节的小知识来了解iOS中的事件分发机制)。一个应用通常只有一个窗口,但也有例外,比如在一个iPhone应用中加载一个电影播放器,这个应用本身有一个窗口,而电影播放器还有另一个窗口。

在iPhone开发中,一个应用程序应该只有一个UIWindow的实例,UIWindow在iPhone中是UIView的一个特殊子类,在程序初始化时,通过装载MainWindow.xib或者在代码中创建,它的大小应该就是手机屏幕的大小,并且不应该像普通的UIView一样,设置UIWindow实例(一个特殊的UIView实例的UIView中的属性)。

官网说明:
A UIWindow object coordinates the presentation of one or more views on a screen. Most apps have only one window, which presents content on the main screen, but apps may have an additional window for content displayed on an external display.
To change the content of your app, you use a view controller to change the views displayed in the corresponding window. You never replace the window itself.
In addition to hosting views, windows work with the UIApplication object to deliver events to your views and view controllers.

UIWindow的作用

和Mac OS X的应用程序有所不同,iPhone应用程序通常只有一个窗口,表示为一个UIWindow类的实例。您的应用程序在启动时创建这个窗口(或者从nib文件进行装载),并往窗口中加入一或多个视图,然后将它显示出来。窗口显示出来之后,您很少需要再次引用它。

在iPhone OS中,窗口对象并没有像关闭框或标题栏这样的视觉装饰,用户不能直接对其进行关闭或其它操作。所有对窗口的操作都需要通过其编程接口来实现。应用程序可以借助窗口对象来进行事件传递。窗口对象会持续跟踪当前的第一响应者对象,并在UIApplication对象提出请求时将事件传递它。

还有一件可能让有经验的Mac OS X开发者觉得奇怪的事是UIWindow类的继承关系。在Mac OS X中,NSWindow的父类是NSResponder;而在iPhone OS中,UIWindow的父类是UIView。因此,窗口在iPhone OS中也是一个视图对象。不管其起源如何,您通常可以将iPhone OS上的窗口和Mac OS X的窗口同样对待。也就是说,您通常不必直接操作UIWindow对象中与视图有关的属性变量。

在创建应用程序窗口时,您应该总是将其初始的边框尺寸设置为整个屏幕的大小。如果您的窗口是从nib文件装载得到,Interface Builder并不允许创建比屏幕尺寸小的窗口;然而,如果您的窗口是通过编程方式创建的,则必须在创建时传入期望的边框矩形。除了屏幕矩形之外,没有理由传入其它边框矩形。屏幕矩形可以通过UIScreen对象来取得,具体代码如下所示:

UIWindow* aWindow = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

虽然iPhone OS支持将一个窗口叠放在其它窗口的上方,但是您的应用程序永远不应创建多个窗口。系统自身使用额外的窗口来显示系统状态条、重要的警告、以及位于应用程序窗口上方的其它消息。如果您希望在自己的内容上方显示警告,可以使用UIKit提供的警告视图,而不应创建额外的窗口。

例子:

//  DrugHomeAppDelegate.m- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {         self.viewController = [[DrugHomeViewController alloc] initWithNibName:@"DrugHomeViewController" bundle:nil];    } else {        self.viewController = [[DrugHomeViewController alloc] initWithNibName:@"DrugHomeViewController-ipad" bundle:nil];     }    _navigationController = [[UINavigationController alloc] initWithRootViewController:_viewController];    _navigationController.navigationBar.topItem.title = @"药品指南";    //self.window.rootViewController = self.viewController;    [_window addSubview:_navigationController.view];    [self.window makeKeyAndVisible];    return YES;}

原创粉丝点击