视图运行时交互模型
苹果官网的一篇官方文档。
有以下内容:
- 用户触控屏幕
- 硬件对用户的触控事件报告给UIKit框架
- UIKit框架打包触控事件为一个UIEvent的类,然后把它分发到一个合适的view
- 你的view的响应事件代码对这个事件作出响应
具体有:
▪调整视图或其子视图的属性变量(边框、边界、透明度等)。
▪将视图(或其子视图)标识为需要修改布局。
▪将视图(或其子视图)标识为布局需要重画。
▪将数据发生的变化通报给控制器。 - 如果一个view的坐标由于某些原因发生改变,UIKit框架会更新她的子view,但会遵循下面的规则:
▪如果你为你的views设定了autoresizing的规则,那么UIKit会根据这些规则自动调整每一个view
▪如果这些view实现了layoutSubviews的方法,UIKit框架会调用。(LayoutSubviews会调用设置好的constraints去设置你的view,还有子类能重写这方法。) - 如果一个view 的任一部分需要被重绘,UIKit会请求这个view自行重绘。一般的视图都会显式的定义了drawRect:,UIKit会调用这个方法。
- 任何更新的视图都会联合剩余应用可视部分并且发送到图形硬件显式。
- 图形硬件把修改的内容传递到屏幕上
基于上述的步骤说明可以看出,UIKit为您自己定制的视图提供如下主要的结合点: 下面这些事件处理方法:
▪touchesBegan:withEvent:
▪touchesMoved:withEvent:
▪touchesEnded:withEvent:
▪touchesCancelled:withEvent:
- layoutSubviews方法
- drawRect:方法大多数定制视图通过实现这些方法来得到自己期望的行为。您可能不需要重载所有方法,举例来说,如果您实现的视图是固定尺寸的,则可能不需要重载layoutSubviews方法。类似地,如果您实现的视图只是显示简单的内容,比如文本或图像,则通常可以通过简单地嵌入UIImageView和UILabel对象作为子视图来避免描画。重要的是要记住,这些是主要的结合点,但不是全部。UIView类中有几个方法的设计目的就是让子类重载的