9

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

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

4

3 回答 3

21

问题是平移手势识别器是滚动视图中用来控制滚动的。您的手势识别器优先并禁用滚动视图

如果您希望始终能够滚动,您可以将手势识别器设置为要求滚动视图失败,然后才能正常工作:

[self.myCustomPanRecognizer requireGestureRecognizerToFail:self.scrollView.panGestureRecognizer]; 

编辑:正如巴斯蒂安在评论中指出的那样,对平移手势的引用仅在 iOS 5 中,在此之前,检查手势识别器数组并找到 UIPanGestureRecognizer 类型的一个

如果你想让两者都工作,你可能需要做一些事情来将你的识别器与滚动视图分开,例如让用户在你的自定义识别器被识别之前点击并按住。

还有一个委托方法可以让两个识别器一起工作,但我不确定当两者都是相同类型时它的工作情况如何

于 2012-02-04T13:25:13.027 回答
10

如果你想同时使用这两个,你可以使用

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

来自代表,但这可能不是你想要的;)

于 2012-02-04T18:49:47.997 回答
1

斯威夫特 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
    }

}

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

于 2018-12-16T12:37:44.987 回答