我正在向UIScrollView
添加子视图,然后我将UIPanGestureRecognizer
添加到这些子视图中。一切正常但现在将UIPanGestureRecognizer
添加到滚动视图的子视图后,滚动是不可能的。
这个问题的可能解决方案是什么?
答案 0 :(得分:21)
问题在于平移手势识别器是滚动视图中用于控制滚动的内容。您的手势识别器正在优先处理并禁用滚动视图
如果您希望始终能够滚动,可以将手势识别器设置为要求滚动视图在其工作之前失败:
[self.myCustomPanRecognizer requireGestureRecognizerToFail:self.scrollView.panGestureRecognizer];
巴斯蒂安在评论中指出编辑,对于pan guest的引用仅在iOS 5中,在此之前,检查手势识别器阵列并找到UIPanGestureRecognizer类型之一
如果您想要两者兼顾,您可能需要做一些事情来将识别器与滚动视图分开,例如:在识别自定义识别器之前,让用户点按并按住。
还有一个委托方法,允许两个识别器一起工作,但我不确定这两种方法在同一类型下的效果如何
答案 1 :(得分:10)
如果您想同时使用两者,可以使用
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
来自代表的,但这可能不是你想要的;)
答案 2 :(得分:0)
快捷键4
使视图控制器符合UIGestureRecognizerDelegate
...
SomeViewController: UIViewController, UIGestureRecognizerDelegate {
...
}
...将视图控制器设置为自定义平移手势识别器的委托...
customPanGestureRecognizer.delegate = self
...并使用同时委托,允许自定义平移器和滚动视图(或表格视图)的平移器同时运行...
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if otherGestureRecognizer == scrollView.panGestureRecognizer { // or tableView.panGestureRecognizer
return true
} else {
return false
}
}
还有两种其他方法可以询问委托人,一个手势识别器是否应该要求另一个手势识别器失败,或者另一个手势识别器是否应该要求一个手势识别器失败。除此以外,您可能还需要进一步的优化,但这是起点。