如何将UIPanGestureRecognizer添加到UIScrollView的子视图中

9
我正在向一个UIScrollView添加子视图,然后我给这些子视图添加了UIPanGestureRecognizer。一切都正常,但是现在在将UIPanGestureRecognizer添加到滚动视图的子视图之后,无法滚动。

可能的解决方案是什么?


你在哪里添加子视图,以及在哪里附加平移手势识别器? - Simon Germain
1
可能是重复的问题:在UIScrollView中添加UIPanGestureRecognizer后禁用了滚动 - rob mayoff
2
你在三个小时之前已经问过完全相同的问题。 - rob mayoff
我已经解决了这个问题,而不是使用Pan手势识别器和覆盖TouchesBegan、TouchesMove、TouchesEnded、TouchesCancelled方法(在Xamarin中)。在子视图中,当我想要移动/平移时,我禁用UIScrollView超级视图的滚动。 - Michal Dobrodenka
3个回答

22
问题在于,滑动手势识别器是用于控制滚动的,您的手势识别器会优先进行识别并禁用滚动视图。如果您希望始终能够滚动,则可以将您的手势识别器设置为需要先失败滚动视图的手势识别器,然后它才能起作用。
[self.myCustomPanRecognizer requireGestureRecognizerToFail:self.scrollView.panGestureRecognizer]; 

编辑:正如Bastian在评论中指出的那样,关于平移手势的引用仅适用于iOS 5,在此之前,请检查手势识别器数组并找到类型为UIPanGestureRecognizer的手势识别器。

如果您希望两者同时工作,则可能需要采取一些措施来将您的识别器与滚动视图分离,例如让用户在自定义识别器被识别之前轻触并保持屏幕。

还有一个委托方法可以让两个识别器一起工作,但我不确定当两个识别器类型相同时这会有多好的效果。


1
scrollview.panGestureRecognizer 仅适用于 iOS5 及以上版本。如果您想支持 iOS4,可以从 scrollview 获取手势识别器并检查类以获取 pangesturerecognizer。 - Bastian
谢谢@Bastian,我没有意识到它只适用于iOS 5,已更新答案。 - wattson12
如果我们想重新允许self.scrollView.panGestureRecognizer呢? - M David

10

如果您想同时使用两个,您可以使用:

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

从委托中获取,但那可能不是你想要的 ;)


不幸的是,这与属于滚动视图的手势识别器不兼容。这些识别器要求它们关联的滚动视图也是它们的委托。 - isaac
如果您无法更改scrollview的手势识别器的委托,则仍然可以更改其他识别器的委托。 - Bastian
是的,这是正确的,但我相信你需要两个协调识别器都向委托方法返回YES。 - isaac
你可以这样做:
  • (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {if ([gestureRecognizer isEqual:yourGestureRcognizer] && [otherGestureRecognizer isEqual:scrollView.panGestureRecognizer]) { return YES; } else { //其他计算 }
}
- Frane Poljak

1

Swift 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
    }

}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接