作者:朱克锋
邮箱:zhukefeng@iboxpay.com
转载请注明出处:http://blog.csdn.net/linux_zkf
任何时候,当用户和您的程序界面进行交互、或者您的代码以编程的方式进行某些修改时,UIKit内部都会发生一个复杂的事件序列。在事件序列的一些特定的点上,UIKit会调用您的视图类,使它们有机会代表应用程序进行事件响应。理解这些调用点是很重要的,有助于理解您的视图对象和系统在哪里进行结合。
下面的步骤说明进一步刨析,解释了序列的每个阶段都发生了什么,以及应用程序可能如何进行响应。
1. 用户触击屏幕。
2. 硬件将触击事件报告给UIKit框架。
3. UIKit框架将触击信息封装为一个UIEvent对象,并派发给恰当的视图。
4. 视图的事件处理方法可以通过下面的方式来响应事件:
▪调整视图或其子视图的属性变量(边框、边界、透明度等)。
▪将视图(或其子视图)标识为需要修改布局。
▪将视图(或其子视图)标识为布局需要重画。
▪将数据发生的变化通报给控制器。
5. 当然,上述的哪些事情需要做及调用什么方法来完成是由视图来决定的。
6. 如果视图被标识为需要重新布局,UIKit就调用视图的layoutSubviews方法。您可以在自己的定制视图中重载这个方法,以便调整子视图的尺寸和位置。举例来说,如果一个视图具有很大的滚动区域,就需要使用几个子视图来“平铺”,而不是创建一个内存很可能装不下的大视图。在这个方法的实现中,视图可以隐藏所有不需显示在屏幕上的子视图,或者在重新定位之后将它们用于显示新的内容。作为这个过程的一部分,视图也可以将用于“平铺”的子视图标识为需要重画。
7. 如果视图的任何部分被标识为需要重画,UIKit就调用该视图的drawRect:方法。UIKit只对那些需要重画的视图调用这个方法。在这个方法的实现中,所有视图都应该尽可能快地重画指定的区域,且都应该只重画自己的内容,不应该描画子视图的内容。在这个调用点上,视图不应该尝试进一步改变其属性或布局。
8. 所有更新过的视图都和其它可视内容进行合成,然后发送给图形硬件进行显示。
9. 图形硬件将渲染完成的内容转移到屏幕。
请注意:上述的更新模型主要适用于采纳内置视图和描画技术的应用程序。如果您的应用程序使用OpenGL ES来描画内容,则通常要配置一个全屏的视图,然后直接在OpenGL的图形上下文中进行描画。您的视图仍然需要处理触碰事件,但不需要对子视图进行布局或者实现drawRect:方法。
基于上述的步骤说明可以看出,UIKit为您自己定制的视图提供如下主要的结合点:
1. 下面这些事件处理方法:
▪f2 touchesBegan:withEvent:
▪f2 touchesMoved:withEvent:
▪f2 touchesEnded:withEvent:
▪f2 touchesCancelled:withEvent:
2. layoutSubviews方法
3. drawRect:方法
大多数定制视图通过实现这些方法来得到自己期望的行为。您可能不需要重载所有方法,举例来说,如果您实现的视图是固定尺寸的,则可能不需要重载layoutSubviews方法。类似地,如果您实现的视图只是显示简单的内容,比如文本或图像,则通常可以通过简单地嵌入UIImageView和UILabel对象作为子视图来避免描画。
重要的是要记住,这些是主要的结合点,但不是全部。UIView类中有几个方法的设计目的就是让子类重载的