object-c 第五章

第五章 图形用户界面(GUI)

图形用户界面是现代计算机的特征之一。几乎所有的消费型个人电脑都离不开图形界面,只有那些使用服务器,超级计算机或其他特殊用途的电脑才不需要。为用户设计图形界面是开发Cocoa的基础,理解如何设计有吸引力和稳定的图形界面以及如何实现,更是开发者的重要技能。

本章讨论的用户接口使用与Cocoa和Cocoa Touch。设计稳定和有趣的UI 是很大的话题,并不适合本章讨论,所以,如果你对如何设计伟大的用户接口感兴趣,可以参考《Tapworthy by Josh Clark》一书。本章你会学习到OSX 和iOS 核心动画技术。

OSX 和 iOS 接口

iOS 和OSX 都是通过场景来表示它们的用户接口,而它们接收用户输入的不同方式决定了它们接口的较大区别。

在OSX, 顶层对象是window。一个窗体包含控件,比如按钮,标签和文本字段,你可以在场景内移动控件以适合展示给用户。同一时间会在场景内展示多个窗体。有时候窗体需要重画,因为窗体需要在它变大或变小时如何展示其排版。最后,有些窗体可以全屏。这个特点自引入OSX10.7以后就变得越来越普遍。

iOS 则通过一种不同的方法来处理窗体。在iOS中,用户一次只能处理一个全屏的场景。每个场景都是由view controller 管理。视图控制器从属应用的窗体,而每次展示在屏幕上只有窗体。几乎所有的iOS应有有且仅有一个窗体,除了多屏展示以外。

之前在‘OS X 应用’ 一章中提及应用是通过加载nib文件来加载用户接口的。至于nil这个缩写其实来源于‘NeXT Interface Builder’,从XCode4 开始nib文件就独立发布。

MVC和应用设计

在第四章曾经讨论过Cocoa大量使用MVC模式来设计。总的来说,MVC设计模式将应用的职责分成三类:模型,处理数据存储;视图,表示用户接口,接受输入输出;控制器,起桥梁作用。

Xcode 的Interface Builder仅仅处理视图,剩下的就处理模型和控制器,这样一来,就可以在相对分离的情况下集中精力处理接口。

Nib文件

广泛地说,Nib是用来存储对象的文件。大多数情况,nib文件只包含接口,不过也可能作为对象的普通容器。

Nib文件将所谓的“冻结”对象以序列化的形式存储在文件里,当然包括对象所有的属性(比如,按钮,它的位置,标签文本以及其他信息)。当应用需要展示一个窗体时,就需要加载nib文件,“解冻”这些对象,并展示给用户。

基于此,nib文件也可以存储自定义类的对象。因此,在nib文件加载时,你也可能创建你自己的类的实例,然后,将它和视图连接起来。

除非你所设计的界面不对用户进行任何响应,否则,你需要将视图和你的控制器连接起来-即你自定义的代码。

有两种方法实现这样的连接:outlets和actions。后面将会讨论。

Nib文件结构

Nib文件包含了一棵对象树。这个树有多个根节点-比如,一个nib文件可能包含两个窗体,每个窗体都有各自的按钮和其他控件。位于顶层位置的对象称为“顶层对象”。

“顶层对象”通常就是展示给用户的东西-OSX 对应是窗体,iOS 对应是视图控制器。不过nib文件里任何对象都可以作为“顶层对象”。

在OSX,任何在屏幕显示的东西,都放在窗体。在Inface Builder 定义了很多不同类型的窗体:

标准窗体
    屏幕上通用的窗体。可以全屏,通常是应用的主窗体。
控制面板窗体
    通常应用程序处于非活动状态时隐藏起来。 比如 inspector窗口和其他从属的窗口通常使用的面板。
带纹理窗体
    和标准窗体不同,它又各种不同的背景颜色。这种窗体经常发生改变,曾经是细条纹,拉丝金属的,现在则更为简洁(如OS X10.7)。
HUD
    这类窗体都深灰色,半透明,主要设计来显示当前所选或包含的辅助操作。多用于多媒体应用,比如QuickTime。

窗体可以包含任意视图。关于视图的更多信息,后续第七章会讨论。

不过在iOS,任何时候,仅能显示一个窗口。OSX 则可以放置任意多窗口,并可随用户随意切换。

为了管理好不同类型的屏幕内容,iOS使用了一类叫view controller的对象。它可以管理单个视图,也可以管理那些子视图。后面将详细介绍。

类似与OSX的窗口,iOS里的view controller 也有多种不同的类型。不同类型定义了不同的结构和行为。

标准view controller
    仅表示一个视图,通常作为子类加入到屏幕的逻辑上去-实际上,子类化是它的主要作用。
Navigation controller