IOS 应用视图交互模型分析

作者:朱克锋

邮箱: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类中有几个方法的设计目的就是让子类重载的




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值