如何在保持单元格选择的同时向 UICollectionView 添加点击手势?
How to add tap gesture to UICollectionView , while maintaining cell selection?
任务
向 UICollectionView
添加单击手势,不妨碍单元格 selection。
我想在 collectionView 的无单元格部分进行一些其他点击。
代码
使用 XCode8、Swift 3.
override func viewDidLoad() {
...
collectionView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print(indexPath)
}
func tap(sender: UITapGestureRecognizer){
print("tapped")
}
结果
是的,它现在妨碍了。当您点击单元格时,它会记录 "tapped".
分析
- 我检查了 collectionView 和单元格的 hitTest return 值。两者都return编辑了被点击的单元格,这意味着它们形成了 Cell -> CollectionView
的响应链
- 单元格上没有手势
- collectionView 上的 3 个手势,似乎没有人使用单元格 select
- UIScrollViewDelayedTouchesBeganGestureRecognizer
- UIScrollViewPanGestureRecognizer
- UITapGestureRecognizer
- callStack,似乎单元 selection 具有与手势的目标动作模式不同的堆栈跟踪。
- 双击手势与单元格一起工作 selection.
问题
找不到更多踪迹。关于 cell selection 的实现方式或完成此任务的任何想法?
您可以通过这种方式获取 indexPath and/or 单元格,而不是尝试强制 didSelectItem
:
func tap(sender: UITapGestureRecognizer){
if let indexPath = self.collectionView?.indexPathForItem(at: sender.location(in: self.collectionView)) {
let cell = self.collectionView?.cellForItem(at: indexPath)
print("you can do something with the cell or index path here")
} else {
print("collection view was tapped")
}
}
每当您想添加手势识别器,但不想从目标视图窃取触摸时,您应该将 gestureRecognizer
实例的 UIGestureRecognizer.cancelsTouchesInView
设置为 false。
我得到另一种方法:添加手势时,设置委托,实现下面的方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
您可以根据自己的需求,根据自己的逻辑,位置或页面隐藏属性决定手势识别器是否接收触摸。
任务
向 UICollectionView
添加单击手势,不妨碍单元格 selection。
我想在 collectionView 的无单元格部分进行一些其他点击。
代码
使用 XCode8、Swift 3.
override func viewDidLoad() {
...
collectionView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print(indexPath)
}
func tap(sender: UITapGestureRecognizer){
print("tapped")
}
结果
是的,它现在妨碍了。当您点击单元格时,它会记录 "tapped".
分析
- 我检查了 collectionView 和单元格的 hitTest return 值。两者都return编辑了被点击的单元格,这意味着它们形成了 Cell -> CollectionView 的响应链
- 单元格上没有手势
- collectionView 上的 3 个手势,似乎没有人使用单元格 select
- UIScrollViewDelayedTouchesBeganGestureRecognizer
- UIScrollViewPanGestureRecognizer
- UITapGestureRecognizer
- callStack,似乎单元 selection 具有与手势的目标动作模式不同的堆栈跟踪。
- 双击手势与单元格一起工作 selection.
问题
找不到更多踪迹。关于 cell selection 的实现方式或完成此任务的任何想法?
您可以通过这种方式获取 indexPath and/or 单元格,而不是尝试强制 didSelectItem
:
func tap(sender: UITapGestureRecognizer){
if let indexPath = self.collectionView?.indexPathForItem(at: sender.location(in: self.collectionView)) {
let cell = self.collectionView?.cellForItem(at: indexPath)
print("you can do something with the cell or index path here")
} else {
print("collection view was tapped")
}
}
每当您想添加手势识别器,但不想从目标视图窃取触摸时,您应该将 gestureRecognizer
实例的 UIGestureRecognizer.cancelsTouchesInView
设置为 false。
我得到另一种方法:添加手势时,设置委托,实现下面的方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
您可以根据自己的需求,根据自己的逻辑,位置或页面隐藏属性决定手势识别器是否接收触摸。