《iOS 6核心开发手册(第4版)》——1.14节秘诀:实时触摸反馈

本节书摘来自异步社区《iOS 6核心开发手册(第4版)》一书中的第1章,第1.14节秘诀:实时触摸反馈,作者 【美】Erica Sadun,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.14 秘诀:实时触摸反馈
iOS 6核心开发手册(第4版)
你曾经需要录制iOS应用程序的演示吗?这总会涉及折中。可以使用架空相机并与影子作斗争,另外用户的手可能会挡住屏幕,或者可以使用像Reflection(http://reflectionapp.com)这样的工具,但是只能看到直接出现在iOS设备屏幕上的内容。这些应用程序录制缺少关于用户触摸和视觉焦点的任何指示。

秘诀1-13提供了一组简单的类(称为TOUCHkit),它们提供了实时的触摸反馈层级,可供演示使用。利用它,可以同时查看正在录制的屏幕以及创建你正尝试展示的交互的触摸。它提供了一种方式,用于编译应用程序,以便进行正常部署和演示部署。不要改变核心应用程序以使用它。它被设计成用作单个开头,为每种应用提供编译版本。

为了演示这种情况,在示例代码库中附带了秘诀1-13中所示的代码以及一个标准的Apple演示。这显示了如何把工具包应用在几乎所有标准的应用程序中。

1.14.1 启用触摸反馈
通过启用TOUCHkit特性来添加触摸反馈,而不会影响正常的代码。要启用TOUCHkit,可以设置单个标志,编译并使用演示版本,并完成触摸叠加。对于App Store部署,要禁用该标志。应用程序将恢复其正常的行为,并且无须担心App Store的非安全调用。

#define USES_TOUCHkit  1

这个秘诀假定正在使用具有单个主窗口的标准应用程序。在编译时,工具包将利用一个自定义的类替换该窗口,用于捕获和复制所有的触摸,允许应用程序显示用户的触摸气泡反馈。

只需执行一处关键的代码级改变,但是它非常小。在应用程序的委托类中,定义一个在构建iOS屏幕时要使用的WINDOW_CLASS。

 #if USES_TOUCHkit
#import "TOUCHkitView.h"
#import "TOUCHOverlayWindow.h"
#define WINDOW_CLASS TOUCHOverlayWindow
#else
#define WINDOW_CLASS UIWindow
#endif

这样就无须声明UIWindow,可以使用通过开关设置的任何类。

WINDOW_CLASS *window;
window = [[WINDOW_CLASS alloc]
     initWithFrame:[[UIScreen mainScreen] bounds]];

从此就可以像正常的那样设置窗口的rootViewController。

1.14.2 截取和转发触摸事件
这个叠加的关键在于截取触摸事件,在正常的界面之上创建一个浮动展示,然后把那些事件转发给应用程序。TOUCHkit视图位于界面的顶部。自定义的窗品类捕获用户触摸事件,并在TOUCHkit视图中把它们展示为圆形。它然后将转发它们,就像用户是在与正常的UIWindow交互一样。为了实现这一点,这个秘诀使用了事件转发。

事件转发是通过调用辅助的事件处理程序实现的。TOUCHOverlayWindow类重写了UIWindow的sendEvent:方法以强制触摸绘图,然后调用它的超类实现以将控制返回给正常的响应者链。

下面的实现是从Apple针对iOS的事件处理指南(Event Handling Guide)中提取的。它集合了所有与当前事件关联的触摸,允许多触摸以及单触摸交互,把它们分配给TOUCHkit视图层,然后通过正常的UIWindow sendEvent:实现把它们重定向到窗口。


《iOS 6核心开发手册(第4版)》——1.14节秘诀:实时触摸反馈

1.14.3 实现TOUCHkit叠加视图
TOUCHkit叠加是一个清晰的UIView单件。它是在应用程序第一次请求其共享实例时创建的,并且调用把它添加到应用程序的关键窗口中。叠加的用户交互标志被禁用,允许触摸通过响应者链继续进行,甚至在通过标准的开始/移动/结束/取消事件回调处理那些触摸之后。

触摸处理事件在每个触点绘制一个圆形,创建一个持久的指向触摸的指针,直到绘图完成为止。秘诀1-13详细说明了处理该功能的回调和绘图方法。


《iOS 6核心开发手册(第4版)》——1.14节秘诀:实时触摸反馈
上一篇:普遍加密和数据权限生态系统初步形成


下一篇:如何实现高容量大并发数据库服务 | 数据库分布式架构设计