•UIKit可识别三种类型的输入事件:
–触摸事件
–运动(加速计)事件
–远程控制事件

IKit框架将触击信息封装为一个UIEvent对象,并派发给恰当的视图(有关UIKit如何将事件递送给您的视图的详细解释,请参见“事件的传递”部分)。

视图的事件处理方法可以通过下面的方式来响应事件:

调整视图或其子视图的属性变量(边框、边界、透明度等)。

将视图(或其子视图)标识为需要修改布局。

将视图(或其子视图)标识为布局需要重画。

将数据发生的变化通报给控制器。

当然,上述的哪些事情需要做及调用什么方法来完成是由视图来决定的。

如果视图被标识为需要重新布局,UIKit就调用视图的layoutSubviews方法。

您可以在自己的定制视图中重载这个方法,以便调整子视图的尺寸和位置。举例来说,如果一个视图具有很大的滚动区域,就需要使用几个子视图来“平铺”,而不
是创建一个内存很可能装不下的大视图。在这个方法的实现中,视图可以隐藏所有不需显示在屏幕上的子视图,或者在重新定位之后将它们用于显示新的内容。作为
这个过程的一部分,视图也可以将用于“平铺”的子视图标识为需要重画。

如果视图的任何部分被标识为需要重画,UIKit就调用该视图的drawRect:方法。

UIKit只对那些需要重画的视图调用这个方法。在这个方法的实现中,所有视图都应该尽可能快地重画指定的区域,且都应该只重画自己的内容,不应该描画子视图的内容。在这个调用点上,视图不应该尝试进一步改变其属性或布局。

所有更新过的视图都和其它可视内容进行合成,然后发送给图形硬件进行显示。

图形硬件将渲染完成的内容转移到屏幕。


注意:上述的更新模型主要适用于采纳内置视图和描画技术的应用程序。如果您的应用程序使用OpenGL
ES来描画内容,则通常要配置一个全屏的视图,然后直接在OpenGL的图形上下文中进行描画。您的视图仍然需要处理触碰事件,但不需要对子视图进行布局
或者实现drawRect:方法。有关OpenGL ES的更多信息,请参见“用OpenGL ES进行描画”部分。

基于上述的步骤说明可以看出,UIKit为您自己定制的视图提供如下主要的结合点:

下面这些事件处理方法:

touchesBegan:withEvent:

touchesMoved:withEvent:

touchesEnded:withEvent:

touchesCancelled:withEvent:

layoutSubviews方法

drawRect:方法


多数定制视图通过实现这些方法来得到自己期望的行为。您可能不需要重载所有方法,举例来说,如果您实现的视图是固定尺寸的,则可能不需要重载
layoutSubviews方法。类似地,如果您实现的视图只是显示简单的内容,比如文本或图像,则通常可以通过简单地嵌入UIImageView和
UILabel对象作为子视图来避免描画。

重要的是要记住,这些是主要的结合点,但不是全部。UIView类中有几个方法的设计目的就是让子类重载的。您可以通过查阅UIView类参考中的描述来了解哪些方法可以被重载。
视图渲染架构


然您通过视图来表示屏幕上的内容,但是UIView类自身的很多基础行为却严重依赖于另一个对象。UIKit中每个视图对象的背后都有一个Core
Animation层对象,它是一个CALayer类的实例,该类为视图内容的布局和渲染、以及合成和动画提供基础性的支持。

和Mac
OS X(在这个平台上Core Animation支持是可选的)不同的是,iPhone OS将Core
Animation集成到视图渲染实现的核心。虽然Core Animation发挥核心作用,但是UIKit在Core
Animation上面提供一个透明的接口层,使编程体验更为流畅。这个透明的接口使开发者在大多数情况下不必直接访问Core
Animation的层,而是通过UIView的方法和属性声明取得类似的行为。然而,当UIView类没有提供您需要的接口时,Core
Animation就变得重要了,在那种情况下,您可以深入到Core Animation层,在应用程序中实现一些复杂的渲染。

最新文章

  1. WPF做验证码,小部分修改原作者内容
  2. 关于oracle 10g creating datafile with zero offset for aix
  3. 开园第一篇 - 论移动开发环境 IOS与Android的差异
  4. Android Service 与 Thread 的区别
  5. 安卓开发_慕课网_ViewPager实现Tab(App主界面)
  6. 解决 MySQL Cluster 通过 某一个MySqld节点新建表时,其他 MySqld节点 看不到表内容的问题
  7. iOS8中如何将状态栏的字体颜色改为白色
  8. asp.net mvc 事务处理:Transactions
  9. JavaWeb学习笔记之Servlet(二)
  10. hadoop源码编译
  11. Malloc碎碎念
  12. 【MySQL案件】ERROR 1418
  13. 列举一些 MacBook Pro 必需的外设和应用程序推荐
  14. Docker学习笔记之Copy on Write机制
  15. [Robot Framework] Robot Framework用Execute Javascript对XPath表示的元素执行scrollIntoView操作
  16. ★itext-为pdf文件添加页眉页脚 | 3步完成 |
  17. 微信 js api[转]
  18. unbuntu 安装及服务器配置
  19. [LeetCode] Next Permutation(一种巧妙的解题方法)
  20. wampserver 虚拟主机

热门文章

  1. block 块函数
  2. xcode7 The operation couldn't be completed.
  3. 关于sql用<>不等于查询数据不对问题
  4. JQuery实战手风琴-遁地龙卷风
  5. webpack 教程 那些事儿05-多页应用
  6. Codeforces Round #292 (Div. 2) C. Drazil and Factorial
  7. 学号160809224姓名黄家帅c语言程序设计实验2 选择结构程序设计
  8. Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等
  9. Delphi中Interface接口的使用方法
  10. 36 网络相关函数(四)——live555源码阅读(四)网络