视图的运行时交互模型(The Runtime Interaction Model for Views)

来源:互联网 发布:windows fix it 下载 编辑:程序博客网 时间:2024/05/18 00:47

         任何时候用户和你的用户接口进行交互,或者任何时候你用代码来改变一些事情,一个完整的事件队列会发生在UIKit的内部。在队列的特定的地方,UIKit会调用你的视图这个类,会给这个类一些改变来对你的应用程序作出反应.理解这个调用对于理解视图在哪里适应系统是很重要的.图1-7 显示了从用户触碰屏幕开始到结束,对这些事件作出反应并且在平面系统中更新屏幕内容的基本事件队列。对于任何用编程开始的动作,相同的事件队列也会发生。

图 1-7


以下的步骤按照图1-7的事件队列分步甚至更详细的进行讲解,解释了在每个阶段发生了什么和你可能想要你的应用程序怎样做出反应。
1.用户触碰了屏幕。

2.硬件将触碰事件发送给了UIKit框架。

3.UIKit框架将这个触碰事件打包成一个UIEvent对象,然后将它发送到合适的视图中。(如果想要更详细了解UIKit如何传递事件到视图中,请参考 Event Handling Guide for iOS)

4.视图对事件作出反应的处理事件的代码。例如,你的代码可能是:
   1>改变视图或者它的子视图的properties (frame, bounds, alpha, 等等)
   2>调用setNeedsLayout方法来告诉视图(或者它的子视图)需要更新布局
   3>调用 setNeedsDisplay 或者 setNeedsDisplayInRect:方法来告诉视图(或者它的子视图)需要重新绘制
   4>通知控制器来改变一些数据
   当然,视图应该做这几件事情中的那几件和哪些方法应该被调用,这取决于你的决定

5.如果因为一些原因视图的几何图形发生改变,UIKit会通过以下的规则来更新它的子视图:
a.如果你已经通过autoresizing规则来配置你的视图,UIKit会通过这些规则来调整每个视图.如果你想了解更多有关于autoresizing如何工作的,请参考 Handling Layout Changes Automatically Using Autoresizing Rules.文档
b.如果视图实现了layoutSubviews方法,UIKit会调用这个方法
在你的自定义视图中,你可以重写这个方法,通过这个方法来调整任意子视图的位置和大小.例如,一个视图有一个很大的可以滚 动的区域,这个区域需要使用若干个子视图类似于”瓦片”,相比较于创建一个巨大的视图,后者无论如何是不可能装入内存的.在这个方法的实现中,视图会隐藏任意超出屏幕的子视图或者重新定位这些子视图,视图会使用这些子视图来绘制新暴露的内容.作为这个过程的一部分,视图的布局代码也可以使任意需要被重新绘制的视图无效。

6.如果任意视图的任意部分被标记需要被重新绘制,UIKit会告诉视图自己来重新绘制
对于明确定义了一个drawRect:方法的自定义视图,UIKit会调用这个方法.实现这个方法应该尽可能快的重新绘制视图的特定区域
.在这个地方不要对布局做一些额外的改变,也不要对你的应用程序的数据模型对其他的改变.这个方法的目的是用来更新视图的视觉内容.系统标准的视图一贯都是没有实现这个drawRect:方法的,而是管理他们的绘制。

7.任意视图的更新是应用程序的可见内容的其他部分和发送到图形显示硬件的拼合而成

8.图形硬件转变为呈现在屏幕上的内容.
  上述更新模型主要适用于使用标准系统视图和绘图技术的应用程序。 使用OpenGL ES绘制的应用程序通常配置一个全屏视图,并直接绘制到相关的OpenGL ES图形上下文。 在这种情况下,视图仍然可以处理触摸事件,但是因为它是全屏的,所以不需要布置子视图。 有关使用OpenGL ES的更多信息,请参阅OpenGL ES Programming Guide for iOS

在之前确定的步骤中,你自定义的视图的主要整合的要点就是:
事件处理方法:
touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:
touchesCancelled:withEvent:

layoutSubviews方法
drawRect: 方法
对于视图,这些是最经常重写的方法,但是你可能不需要全部重写他们(意思就是需要再重写),如果你使用手势来处理事件,你不需要重写任何事件处理方法.类似地,如果你的视图不添加子视图或者你的子视图的大小没有改变,那就没有理由重写layoutSubviews方法.最后,drawRect: 方法只需当视图的内容可以在运行的时候改变和你使用原生的技术例如:用Core Graphics框架来做绘制时才需要重写.
记住也很重要的是这些主要整合的要点但不是只是这些.视图这个类的很多方法的设计对于子类来说,很多地方都是可以重写的.你应该参考UIView Class Reference文档中方法的描述,看看在你自定义实现的时候,哪些方法可能适合你来重写.
      这是本人翻译苹果开发文档中的一小段,目的在于提高自己的英文水平能力,也放出来与大家分享分享,有错误的或者不理解的地方敬请大家留言,我会积极修改和答复!




0 0