开发者社区> 异步社区> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

《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),并且会在平移事件期间禁用滚动视图。这允许子视图完全控制正在进行的平移姿势,而无须滚动视图对进一步的触摸移动做出反应。


1433d1b12deb611c3444fe93ffe3e628a704ef1c


7464793d088bb1c82a976563e57469646e38f8d6

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《iOS 6核心开发手册(第4版)》——导读
本节书摘来自异步社区《iOS 6核心开发手册(第4版)》一书中的目录,作者 【美】Erica Sadun,更多章节内容可以访问云栖社区“异步社区”公众号查看
1333 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
12049
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载