勿在浮沙筑高台——重新认识UIView
最近在做项目时,使用UIView的时候,有点唯唯诺诺,生怕出错,所以重新读了一遍文档中UIView类的OverView,许多模糊的问题,得到了答案,真是侯捷先生的那句“勿在浮沙筑高台”。
本文章的前半部分为文档中UIView概述的翻译,后半部分为自己的一些理解和一些代码实例。
UIView概述
UIVIew定义
UIView类,按照UIView的OverView定义一个屏幕上矩形区域和用来管理这个区域内容的一些接口。在运行时,一个视图对象处理它区域内内容的渲染(注:CALayer),并且处理这个区域内的交互行为。UIView类自身提供基本的用背景颜色填充矩形区域的方法,想要显示更复杂的内容(注:比如圆环套圆环的背景),需要子类化UView,并实现绘图和事件处理方法。UIKit框架包含一组标准的UView子类,从简单的按钮(注:UIButton)到复杂的表(注:UITableView),都可以直接使用。
因为视图对象是应用程序与用户进行交互的主要方式,它们有许多职责。例如:
绘图和动画:
绘图使用技术例如UIKit, Core Graphics, and OpenGL ES,绘制矩形区域的内容。
视图的一些属性在变成新值时,可以使用动画效果。
布局和子视图管理:
一个视图可以包含零个或多个视图。
每个视图通过它的父视图定义自己的缺省大小。
在需要时,视图可以手动改变它的子视图的大小和位置。
事件处理:
视图是个应答器,可以处理触摸事件和UIResponder类定义的其他事件。
视图可以使用addGestureRecognizer:方法 安装的手势识别器来处理常见的手势。
视图可以嵌入其他视图和创建复杂的可视层次。这将创建一个父子关系嵌入的视图(称为子视图)和被嵌入的视图(称为父视图)。通常,一个子视图的可视区域是不受父视图边界限制的,但在iOS可以通过clipsToBounds属性改变这种设置。一个父视图可以包含任意数量的子视图,但自视图只有一个父视图,该父视图负责恰当地定位它的子视图。
通过frame, bounds, and center 这些几何属性定义一个视图,Frame在父视图坐标系统定义视图的起点和大小,并且常用在布局去调整视图的大小或位置。Center属性可以用在不改视图大小光调整视图位置。Bounds在自己的坐标体系定义了视图内部的尺寸,通常只被用在自定义渲染代码。Frame和Bounds的大小部分是耦合在一起,以便改变矩形区域的大小,两者的尺寸部分都会更新。
创建一个视图
以编程方式创建一个视图,可以使用代码如下:
@property frame
@property bounds
@property center
@property transform
@property alpha
@property backgroundColor
@property contentStretch
线程问题必须在主线程操作应用程序的用户界面。因此,你应该在代码运行在应用程序的主线程中,调用UIView类的方法。当创建视图对象本身时,不是所有的执行都一定要在主线程中,这是唯一不严格约束的情况。
子类化说明
(略)
翻译部分结束
UIVIew的定义
我的理解,UIView中CALayer的本质,是一块包含一幅位图的缓冲区,主要负责渲染,而UIView继承自UIResponder,通过响应链来处理交互。而在CocoaTouch框架下,所有的编程都是围绕着UIView,即基于视图编程,这种关系就像MFC中,基于对话框编程,程序由数个对话框以及他们之间的关系组成,APP就由数个视图构成。
实现drawRect:方法
通过实现drawRect:方法,使得View显示复杂内容,现在代码点击这里。实现了圆环套圆环(靶心)的显示。