结合手势支持
你可以通过使用手势识别器来给集合视图增加更好的交互体验。给一个集合视图添加手势识别器,然后当这些手势发生时使用它们来触发动作。对于集合视图,有两种类型的动作你可能想要去实现:
- 想要触发对集合视图布局信息的更改
- 想要直接操纵单元格和视图
你应该总是将你的手势识别器依附在集合视图本身上,而不是一个特定的单元格或视图。UICollectionView
类是UIScrollView
的子类,因此将手势识别器依附在集合视图上不太可能会干扰必须跟踪的其他手势。另外,由于集合视图可以访问你的数据源和布局对象,所以你仍然可以恰当地访问你需要操纵的单元格和视图的所有信息。
使用手势识别器来改变布局信息
手势识别器提供了动态修改布局参数的简单方法。例如,你可能会使用捏合手势识别器来改变自定义布局中items
之间的间距。用于配置这种手势识别器的过程相当简单。
- 创建手势识别器
- 将手势识别器依附在集合视图上
- 使用手势识别器的处理方法来更新布局参数并使布局对象无效
你使用与所有对象相同的alloc/init
过程创建手势识别器。在初始化过程中,指定目标对象和动作方法当手势触发时调用。然后调用集合视图的addGestureRecognizer:
方法来将手势依附在视图上。大多数实际工作发生在初始化时指定的动作方法中。
清单4-1显示由依附在集合视图上的捏合手势是比诶去调用的动作方法的示例。在该示例中,捏合数据是用来改变在自定义布局中单元格之间的距离。该布局对象实现了自定义的方法updateSpreadDistance
。该方法验证新的距离值,并在稍后的布局过程中存储它以供使用。然后,动作方法中使布局无效,并迫使它基于新值更新items的位置。
关于创建手势识别器并将它依附到视图中的更多信息,请看Event Handling Guide for UIKit Apps.
使用默认手势行为
UICollectionView
类会监听轻拍手势来初始化它的代理方法来突出高亮和选中。如果你想要添加自定义的轻拍或长按手势给集合视图,配置你的手势识别器的值与集合视图已经使用的值不同。例如,你可以配置一个轻拍手势识别器来仅仅响应双击事件。
清单4-2显示了怎样把你的集合视图响应你的手势事件而不是监听cell
的选中或高亮。由于集合视图不会使用手势识别器来启动它的代理方法,通过设置你的手势识别器的属性delaysTouchesBegan
为YES
来延迟注册其他触摸事件,或者通过设置你的手势识别器的属性cancelsTouchesInView
为YES
来取消触摸事件,利用这两种方式来使你的自定义手势识别器获得比默认选中监听器更高的优先级。每当注册一个轻拍手势,它将首先检查你的手势识别器是否应该具有优先权。如果输入对你的手势识别器无效,则代理方法将被正常调用。
操作单元格和视图
你如何使用手势识别器来操作单元格和视图依赖于你计划使用的操作类型。简单的插入和删除可以在标准手势识别器的动作方法内部执行。但是如果你计划更复杂的操作,你可能需要自定义手势识别器来跟踪触摸事件本身。
一种类型的操作是需要自定义手势识别器来移动集合视图中的单元格从一个位置到另一个位置。移动单元格最直接的方式是从集合视图中删除它(临时的),使用手势识别器来拖拽单元格的视觉表示,然后当触摸事件结束时插入单元格到它新的位置。所有这些都需要自己管理触摸事件,与布局对象紧密配合来确定新的插入位置,操作数据源更改,然后在新的位置插入该item
。
关于创建自定义手势识别器的更多信息,请看Event Handling Guide for UIKit Apps.
网友评论