《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开发
iOS 多个滚动控件嵌套Demo
iOS 多个滚动控件嵌套Demo
104 0
|
缓存 安全 Linux
自建iOS构建流水线建设核心原理剖析
文章主要从iOS打包机远程构建的角度分析,整体链路脚本涉及的shell、ruby、security指令、xml以及iOS工程化相关知识,文章通过一个远程构建流程简单并重点的讲解了如何规避本地打包环境下的小的修改出包存在的大量人工操作,如何动态化配置证书、版本号等信息以及内测分发方式的避坑点。
自建iOS构建流水线建设核心原理剖析
|
iOS开发
iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)
iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)
189 0
iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)
|
iOS开发
iOS开发 - 滚动选择器
iOS开发 - 滚动选择器
221 0
iOS开发 - 滚动选择器
|
iOS开发
iOS开发-banner滚动图自定义
iOS开发-banner滚动图自定义
246 0
iOS开发-banner滚动图自定义
|
iOS开发
ios贝塞尔曲线表格视图
x轴和y轴都是可自定义,曲线的值也是对应的值
111 0
|
iOS开发
iOS之UIPickerView滚动事件
在开发中,我们会用到pickerview滚动条,那如何监听到pickview的滚动事件呢,之前开发就遇到过一个问题,快速滑动秒选确定按钮,地址显示不对的问题,解决办法为在点选确定辅助按钮的时候判断当时的pickerView是否正在滚动,如果在滚动则不允许触发点选确定后的其他操作。
433 0
|
iOS开发
iOS开发 - ScrollView滚动时怎么判断滚动停止及滚动的方向
iOS开发 - ScrollView滚动时怎么判断滚动停止及滚动的方向
937 0
|
iOS开发
iOS开发-加在透明视图上的控件会透明
iOS开发-加在透明视图上的控件会透明
166 0
|
iOS开发
IOS滚动不流畅问题
IOS滚动不流畅问题
103 0