UIView的重要性
大部分你想要可视化操作都是由视图对象-即UIView类的实例-来进行的。
ios 显示图层的层次框架
- 上层: UIView视图和它的层对象,每个UIKit框架里的视图都被一个层对象支持(通常是一个CALayer类的实例)(UIView视图可以是容器)
- 中间层:在它们的层对象之后是Core Animation的解释对象,
- 底层: 最后是用来管理屏幕上的位的硬件缓存。 它管理管理着后台的视图存储和处理视图相关的动画。
视图与Core Animation层联合起来处理着视图内容的显示和动画过渡。
为了理解视图和层之间的关系,我们可以借助于一些例子。Figure 1-1 显示了样例程序的视图层次及其对底层Core Animation层的关系。
应用中的视图包括了:
- 一个window(同时也是一个视图),
- 一个通用的表现得像一个容器视图的UIView对象,
- 一个图像视图,(注意这个应用包含了一个额外的图像视图,它是用来实现动画的)。为了简化,同时因为这个视图通常是被隐藏的,所以没把它包含在下面的图中。
- 一个控制显示用的工具条
- 一个工具条按钮(它本身不是一个视图但是在内部管理着一个视图,你不能直接访问它的层对象。)。
Figure 1-1 View architecture
使用Core Animation的层对象有很重要的性能意义。一个视图对象的绘制代码需要尽量的少被调用,当它被调用时,其绘制结果会被Core Animation缓存起来并在往后可以被尽可能的重用。重用已经解释过的内容消除了通常需要更新视图的开销昂贵的绘制周期。内容的重用在动画中特别重要,我们可以使用已有的内容,这样比创建新的内容开销更小。
视图可以是一个视图容器
除了提供自己的内容之外,一个视图也可以是一个容器,包含其他视图。
- 在视觉上,子视图隐藏了父视图的内容。
- 如果子视图是完全不透明的,那么子视图所占据的区域就完全的隐藏了父视图的相应区域。如果子视图是部分透明的,那么两个视图在显示在屏幕上之前就混合在一起了。
- 每个父视图都用一个有序的数组存储着它的子视图,存储的顺序会影响到每个子视图的显示效果。
- 如果两个兄弟子视图重叠在一起,后来被加入的那个(或者说是排在子视图数组后面的那个)出现在另一个上面。
视图间的大小变化
- 父子视图关系也影响着一些视图行为。改变父视图的尺寸会连带着改变子视图的尺寸和位置。在这种情况下,你可以通过合适的配置视图来重定义子视图的尺寸。
- 其他会影响到子视图的改变包括隐藏父视图,改变父视图的alpha值,或者转换父视图。
各视图层事件处理
- 视图层次的安排也会决定着应用如何去响应事件。在一个具体的视图内部发生的触摸事件通常会被直接发送到该视图去处理。
- 如果该视图没有处理,它会将该事件传递给它的父视图,在响应者链中以此类推。具体视图可能也会传递事件给一个干预响应者对象,像视图控制器。如果没有对象处理这个事件,它最终会到达应用对象,此时通常就被丢弃了。