【问题标题】:Prevent UIScrollView's UIPanGestureRecognizer from blocking UIScreenEdgePanGestureRecognizer防止 UIScrollView 的 UIPanGestureRecognizer 阻塞 UIScreenEdgePanGestureRecognizer
【发布时间】:2014-03-14 17:22:56
【问题描述】:

我有一个UIScrollView,它会在我的应用程序的一个页面上填满屏幕,但我希望允许用户从屏幕边缘平移以显示其背后的视图。问题是 UIScrollView 窃取了我在屏幕边缘的UIScreenEdgePanGestureRecognizer 的触摸。不幸的是,我无法从具有UIScrollView 的视图控制器访问UIScreenEdgePanGestureRecognizer(反之亦然),因此我无法使用requireGestureRecognizerToFail: 方法,因为我无法指定应该使用哪个手势识别器允许失败。带有滚动视图的视图控制器是容器视图控制器的子视图控制器,该控制器将屏幕边缘平移手势识别器附加到容器视图控制器自己的视图之一。

我也无法使用委托方法

-(BOOL)gestureRecognizer:shouldRequireFailureOfGestureRecognizer:

因为UIScrollView 不允许我将视图控制器设置为滚动视图UIPanGestureRecognizer 的代理。

如何防止滚动视图从我自己的手势识别器中窃取边缘平移触摸?

【问题讨论】:

    标签: ios iphone uiscrollview uigesturerecognizer uipangesturerecognizer


    【解决方案1】:

    不幸的是,创建这种行为可能是真正的 P*** i* t** A**。

    幸运的是,即使您无法直接访问 GestureRecognizer,也可以使用 UIGestureRecognizer Delegate 创建此行为。

    -(BOOL)gestureRecognizer:shouldRequireFailureOfGestureRecognizer:
    -(BOOL)gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
    -(BOOL)gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer: 
    

    当你的gestureRecognizer与scrollView'碰撞'时,在委托方法中传递的第二个参数('otherGestureRecognizer')保存UIScrollView的PanGestureRecognizer(或私有Apple - 子类)。

    所以只需设置您的 UIScreenEdgePanGestureRecognizer 的委托来回复委托方法。

    这两种方法的命名非常不理想,老实说,我真的不知道您的情况的正确返回值是什么。

    我昨天刚遇到这个问题,我通过残酷的反复试验解决了它。

    我的情况是,从 shouldRequireToFail 和 shouldBeRequiredToFail 方法返回 NO 并从同时方法返回 YES 解决了我的问题。

    Note: Returning NO from both methods changed the behavior compared to not 
    even implementing the methods at all. Even though the documentation says 
    the default return value is NO.
    

    但是,任何 GestureRecognizer 行为都可以通过使用委托方法来实现。但正如我上面所说,方法的命名非常混乱。 + 这些方法几乎没有有用的文档。

    【讨论】:

    • 我同意,这种 API 会迫使解决方案变得很糟糕。我最终做的是实现-(BOOL)gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: 并在返回YES 之前调用[otherGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer];。不确定这是否是好的做法,但它确实有效。我没有发现从这两种方法返回 NO 会改变行为。您可能需要检查这是否真的发生了。
    • 也许从两种方法返回 NO 改变了我的行为,因为我有 3 个不同的gestureRecognizer 交互并且它们中的每一个都在实现委托方法。也许我应该改变我的gestureRecognizer设计,但它现在对我有用,所以我会把一切都留在原地:)
    • @TylerCloutier 这是唯一对我有用的解决方案。谢谢。
    • 我实现了 (BOOL)gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer: ,对于与此碰撞的手势识别器返回 YES。它按预期工作。顺便说一句,这些委托方法的命名确实很混乱。谢谢。
    【解决方案2】:

    无需将屏幕平移手势的委托设置给您的视图控制器即可完成此操作。

    [scrollView.panGestureRecognizer requireGestureRecognizerToFail:screenPanGesture];
    

    【讨论】:

    • 这仍然有效,差不多 3 年后。这应该是公认的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2020-10-12
    • 2023-03-11
    相关资源
    最近更新 更多