如何将UIPanGestureRecognizer添加到UIScrollView子视图

时间:2012-02-04 12:17:14

标签: iphone ios uiscrollview uipangesturerecognizer

我正在向UIScrollView添加子视图,然后我将UIPanGestureRecognizer添加到这些子视图中。一切正常但现在将UIPanGestureRecognizer添加到滚动视图的子视图后,滚动是不可能的。

这个问题的可能解决方案是什么?

3 个答案:

答案 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
    }

}

还有两种其他方法可以询问委托人,一个手势识别器是否应该要求另一个手势识别器失败,或者另一个手势识别器是否应该要求一个手势识别器失败。除此以外,您可能还需要进一步的优化,但这是起点。