如何将 UIPanGestureRecognizer 添加到 UIScrollView 子视图
Posted
技术标签:
【中文标题】如何将 UIPanGestureRecognizer 添加到 UIScrollView 子视图【英文标题】:How to add UIPanGestureRecognizer to UIScrollView subviews 【发布时间】:2012-02-04 12:17:14 【问题描述】:我将子视图添加到UIScrollView
,然后将UIPanGestureRecognizer
添加到这些子视图。一切正常,但现在将UIPanGestureRecognizer
添加到滚动视图的子视图后,无法滚动。
有什么办法可以解决这个问题?
【问题讨论】:
在哪里添加子视图以及在哪里附加平移手势识别器? Scrolling is disabled when i add A UIPangesturerecognizer to UIScrollView 的可能重复项 你在问这个问题前三个小时问了完全相同的问题。 我已经解决了这个问题,而不是使用 Pan 手势识别器和覆盖 TouchesBegan、TouchesMove、TouchesEnded、TouchesCancelled 方法(在 xamarin 中)。在子视图中,当我想移动/平移时,我禁用滚动到 UIScrollView 超级视图。 【参考方案1】:问题在于平移手势识别器是滚动视图中用来控制滚动的。您的手势识别器优先并禁用滚动视图
如果您希望始终能够滚动,您可以将手势识别器设置为要求滚动视图失败后才会起作用:
[self.myCustomPanRecognizer requireGestureRecognizerToFail:self.scrollView.panGestureRecognizer];
编辑:正如巴斯蒂安在 cmets 中指出的那样,对平移手势的引用仅在 ios 5 中,在此之前,检查手势识别器数组并找到 UIPanGestureRecognizer 类型的一个
如果您希望两者都工作,您可能需要做一些事情来将您的识别器与滚动视图分开,例如在识别您的自定义识别器之前让用户点击并按住。
还有一个委托方法可以让两个识别器一起工作,但我不确定当两者是相同类型时它的效果如何
【讨论】:
scrollview.panGestureRecognizer
仅适用于 ios5 .. 如果您想支持 ios4,您可以从滚动视图中获取手势识别器并检查类以获取 pangesturerecognizer。
感谢@Bastian,我没有意识到它只是iOS 5,答案已更新
如果我们想重新启用self.scrollView.panGestureRecognizer
【参考方案2】:
如果你想同时使用两个,你可以使用
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
来自代表,但这可能不是您想要的;)
【讨论】:
不幸的是,这不适用于属于滚动视图的手势识别器。这些识别器要求它们关联的滚动视图也是它们的委托。 好吧,如果您无法在滚动视图中更改手势识别器的委托,您可能仍会更改其他识别器的委托。 是的,这是真的,但我相信你需要两个协调的识别器都向委托方法返回 YES。 你可以这样做: - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer if ([gestureRecognizer isEqual:yourGestureRcognizer] && [otherGestureRecognizer isEqual: ]) 返回是; else //其他计算 【参考方案3】:斯威夫特 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
还有另外两种方法可以询问委托一个手势识别器是否应该要求另一个手势识别器失败,或者另一个手势识别器是否应该要求一个手势识别器失败。除此之外,您可能还需要进一步优化,但这是起点。
【讨论】:
以上是关于如何将 UIPanGestureRecognizer 添加到 UIScrollView 子视图的主要内容,如果未能解决你的问题,请参考以下文章