UIView类定义了一个屏幕上得矩形区域, 以及控制区域内部物件的接口. 在运行时, 一个视图负责渲染其区域内的所有物件,并且捕捉物件的响应.
UIView类会自动把矩形区域内部填充上自己的背景色.更复杂的构件可以通过继承UIView然后实现响应的绘制代码及时间处理代码.
UIKit框架包含了很多标准的UIView子类,比如button, 复杂的表.
只有UIView的对象是能看见的,所以很重要,主要负责以下功能:
绘图和动画:
使用UIKit, Core Graphics,和 OpenGL ES绘制矩形区域内部
有些属性可以渐变到新值.
控制图层及子视图:
一个视图可以有0到多个子视图
每个视图都有自身的默认相对尺寸, 与父视图有关
一个视图可以重定义其子视图的坐标及尺寸
事件处理:
视图是UIResponder的子类, 所以可以捕获并处理触碰,晃动事件.
一个视图可以通过addGestureRecognizer:方法来加载手势识别器来处理基本手势.
视图可以嵌入其它视图, 以此来实现复杂的视觉层级. 一般来说,子视图超出父视图的部分不会被裁减掉,但是在iOS中可以通过设置clipsToBounds属性来选择怎么办.
一个视图的几何结构由frame,bounds和center属性决定
创建一个视图:
在iOS中,姊妹视图可以覆盖彼此,所以会由复杂的视图层次.后添加的视图会遮盖先添加的视图.通过一些方法可以改变这种层次关系.
当创建一个新的视图的时候,需要给视图的autoresizingMask属性设置一个合适的值,以确保视图能正确调整大小,视图的大小调整主要是由于设备方向改变了.setNeedsLayout方法也会强制视图更新图层.
视图的绘制循环:
视图只在需要的时候绘制.当一个视图第一次出现, 或者当一个视图的一部分因为图层关系改变而变得可见时, 视图会绘制包含的物件.
对于只包含内置构件的视图(基于UIKit或者Core Graphics), 绘制时会调用drawRect:方法.对于这个方法的实现, 要保证绘制视图的物件到当前图形环境中, 一般drawRect由系统提前调用. 这样就在视图出现前完成了静态可见部分的构造.
当视图的内容发生变化时,需要通过调用setNeedsDisplay 或者 setNeedsDisplayInRect 方法重新绘制相关区域. 以上方法会使系统在下一个绘制循环中重绘视图的内容.
提示:
如果是使用OpenGLES 绘制的内容, 就需要使用GLKView 类代替UIView类.
动画效果:
视图属性的变化过程可以设置为动画效果. 如欲设置需要指出哪个变化需要动画显示.有两种方法设置动画效果:
1. 在iOS4以后, 可以使用动画效果块函数.
2.使用begin/commit 动画方法.
基于块的动画函数(animateWithDuration:animations:)大大简化了动画效果的设置难度.只要指定了展示的动画效果及其选项,就可以在方法调用时实现相应效果.但是只能在iOS4.0以后使用.否则就得使用beginAnimations:context: 和 commitAnimations 类方法来标记动画的开始及结束.
以下视图的属性改变是可以动漫化的:
@property frame
@property bounds
@property center
@property transform
@property alpha
@property backgroundColor
@property contentStretch
多线程:
对视图的操作都应该在主线程中进行,唯一的例外是视图对象的初始化
继承:
UIView是可视化物件的关键继承节点. 继承时需要调节很多表现.
需要重写的方法:
初始化:
initWithFrame: 推荐子类重写这个方法来实现初始化
initWithCoder: 如果子类需要从IB nib 文件初始化,需要重写这个方法
layerClass
绘制:
drawRect: 需要绘制内容时才重写这个方法
图层:
sizeThatFits: 如果视图需要一个合适尺寸就重写
layoutSubviews
didAddSubview: , willAddSubview:
willMoveToSuperview: , didMoveToSuperview跟踪视图的图层变化
willMoveToWindow: , didMoveToWindow
事件捕获:
touchesBegan:withEvent: touchesMoved:withEvent: touchesEnded:withEvent:
touchesCancelled:withEvent: