《iOS 6核心开发手册(第4版)》——1.13节秘诀:从滚动视图中拖动

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

1.13 秘诀:从滚动视图中拖动
iOS 6核心开发手册(第4版)
iOS的丰富的姿势识别器集并不总是能够准确地实现你想要达到的目标。下面举一个例子。设想一个水平滚动的视图,其中一个接一个地填充图像视图,因此可以左右滚动,查看完整的集合。现在,设想你希望能够把项目拖出那个视图,并把它们添加到滚动区域下面的空间中。为此,需要识别那些子视图上向下的触摸(也就是说,垂直于滚动的方向)。

这是我在尝试帮助开发人员Alex Hosgrove时所遇到的一道难题,他尝试构建一个应用程序,它粗略等价于一组冰箱磁贴字母,用户可以把那些字母向下拖动到工作区中,然后处理并排列他们所选的项目。这种情况有两个挑战。第一,谁拥有每个触摸?第二,在识别向下的触摸之后会发生什么?

滚动视图及其子视图都拥有每个触摸中感兴趣的方面。向下的姿势应该生成新对象,横向的姿势应该会平移滚动视图。触摸必须共享,以允许滚动视图及其子视图响应用户交互。可以使用姿势委托解决这个问题。

姿势委托允许添加同时的识别,因此两个识别器可以同时工作。可以通过声明一个协议(UIGestureRecognizerDelegate)并添加一个简单的委托方法来添加这种行为。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
     shouldRecognizeSimultaneouslyWithGestureRecognizer:
          (UIGestureRecognizer *)otherGestureRecognizer
{   
     return YES;
}

不能为滚动视图重新指定姿势委托,因此必须把这个委托重写添加到用于滚动视图的子视图的实现中。

第二个问题(即把轻扫转换为拖动)是通过考虑整个触摸生存期来解决的。每个创建新对象的触摸都开始于一个有向的拖动,但是一旦创建了新视图,就是作为平移结束的。平移识别器在这里比轻扫识别器工作得更好,后者的生存期结束于识别那个时刻。

为了使之发生,秘诀1-12在内置的姿势检测外面手动添加了那个有向移动检测。最终,这种开箱即用的方法提供了重大的编码收益。这是由于一旦检测到轻扫,底层的平移姿势识别器就会继续工作。这允许用户保持移动被轻扫的对象,而不必抬起手指,并重新触摸正在处理的对象。

这种实现检测在垂直方向上至少下移16像素的轻扫,而不会向任何一边偏离超过8像素。当这段代码检测到一个向下的轻扫时,它会向屏幕上添加一个新的DragView(本章前面使用的相同的类),并且允许它为剩余的平移姿势交互沿着触摸前进。

在识别时,类将把它自身标记为处理了轻扫(gestureWasHandled),并且会在平移事件期间禁用滚动视图。这允许子视图完全控制正在进行的平移姿势,而无须滚动视图对进一步的触摸移动做出反应。


《iOS 6核心开发手册(第4版)》——1.13节秘诀:从滚动视图中拖动


《iOS 6核心开发手册(第4版)》——1.13节秘诀:从滚动视图中拖动
上一篇:CSDN社区分享面试经历活动作品7——1天面试4次的有木有


下一篇:RocketMQ配置解析:手把手教老婆看懂broker.properties