本节书摘来自华章计算机《Swift iOS应用开发实战》一书中的第2章,第2.4节,作者:刘铭 著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.4 理解iOS 8的视图和窗口
在前面几节的学习中我们已经为Calculator项目创建了用户界面,其中使用了视图、Label和Button控件,接下来我们将详细了解有关视图和窗口的概念。
2.4.1 视图概述
视图属于可视化对象,多个视图组合起来就组成了iOS应用程序的用户界面。视图本质上反映的是屏幕上的一块特定的矩形区域内所发生的事情,例如,根据用户的交互进行可视化方面的更新。所有视图都是UIKit框架中的UIView类的子类,例如UILabel、UIImageView、UIButton和UITextField都是它的子类。
另外一个比较特别也比较重要的UIView子类就是UIWindow。
2.4.2 UIWindow类
如果你之前开发过Windows或OS X平台的桌面应用程序,肯定会非常熟悉窗口的概念。一个典型的桌面应用程序会有多个窗口,每个窗口都会有标题栏,并且在标题栏中还会有一些控制按钮,负责窗口的关闭、最大化与最小化。这里的窗口,简单来说只是提供了在屏幕上的一个“面”,应用程序在这个“面”上向用户呈现信息和交互的控件。
基于iOS的UIWindow类也提供了相同的功能:为视图组件的显示提供“面”。但是与桌面应用程序之间的不同在于iOS应用程序通常只能有一个窗口,并且这个窗口必须充满整个屏幕,也没有我们在桌面应用程序中所熟悉的标题栏。
UIWindow也是UIView的子类,而且它位于整个应用程序视图层次的最顶端。用户根本无法看到也不能直接与UIWindow对象进行交互,甚至它本身在一般情况下都是由IB自动创建的。
2.4.3 视图的层次
构建iOS 8应用程序的用户界面使用了分层的方式,不同的视图通过父/子关系相互联系。位于这个层次中最顶端的视图是UIWindow对象,然后添加其他类型的视图对象。在本章之前我们设计的用户界面包括1个窗口、1个视图、1个标签和17个按钮。用户界面的视图层次可以用图2-14来表示。
从图2-14中我们可以发现,UIWindow对象是UIView对象的父视图,而UIView则是UIWindow的子视图。同理,UILabel和UIButton则是UIView的子视图。子视图只有一个直接父视图,而一个视图则可以有多个子视图。
另外,视图层次结构可以嵌套更多层级的视图结构,比如我们可以设计下面的层次结构,如图2-15所示。但是为了简化界面,Calculator项目并没有使用这样的层次结构。
视图的层次结构可以有效地帮助开发者组织和管理复杂的用户界面。很明显,子视图总是出现在其父视图的上面。可以想象,当Calculator运行的时候,UILabel总是出现在UIView的上面。不仅如此,当父视图大小发生变化的时候(视图大小改变通常是在屏幕发生旋转的时候),依据视图之间的相互关系子视图的大小和位置也会发生变化。
在Calculator项目中UIWindow对象对用户来说是不可见的,因为它总是会被其上的UIView对象全部覆盖掉,然后在这个UIView上面显示UILabel和UIButton。
视图的层次同时也定义了交互事件的处理方式,称做 “响应链”。例如,一个子视图收到一个不能处理的事件,那么这个事件就会被传递到它的即时父视图对象。如果父视图也不能处理该事件,则继续传递给它的父视图。就这样层层传递,直到某个视图对象可以处理这个事件为止。
2.4.4视图的类型
UIKit框架包含了各种视图对象,可以分为以下几类。
(1)窗口
窗口(The Window)特指前面所介绍的UIWindow类,它是整个视图层次中的根视图(root view),并且为所有需要绘制的子视图提供一个“面”。
(2)容器视图
与普通的视图对象相比,容器视图(Container View)增加了一些功能,比如,UIScrollView类就提供了滚动条和滚动功能。
(3)控件
控件类(Controls)所包含的视图既可以呈现信息又可以响应用户的交互。控件类都继承自UIControl类(UIControl继承自UIView),如按钮、滑动块、开关等。
(4)显示视图
显示视图(Display Views)与控件差不多,但它只能呈现反馈的可视化信息,并不能响应用户的交互,比如UILabel和UIImageView类。
(5) 文本和网页视图
UITextView和UIWebView这两个类都能够显示特定格式的信息给用户,比如UIWebView可以显示HTML格式的内容。
(6)导航视图和标签栏
导航视图(Navigation Views)和标签栏(Tab Bars)提供了让用户在程序中进行视图导航的机制,比如电话程序和邮件程序。
(7)警告视图
警告视图(Alert Views and Action Sheets)的设计目的是当有紧急或重要信息的时候提醒用户注意,它们还提供了可选的按钮让用户决定如何进行后面的操作。UIAlertView会在屏幕中央的位置显示一个消息框,UIActionSheet则会从屏幕的下方滑入。