在某些情况下让 superview 响应 subView 的 UIPanGesture

Posted

技术标签:

【中文标题】在某些情况下让 superview 响应 subView 的 UIPanGesture【英文标题】:make superview respond to subView's UIPanGesture in some cases 【发布时间】:2014-03-13 12:53:56 【问题描述】:

我有一个滚动视图,它包含一个子视图。 SubView 添加了一个 panGesture。

我想要什么

只有当平移是垂直完成时,我才需要 pangesture 在子视图上工作。如果平移水平发生,我希望滚动视图响应平移而不是子视图。我怎样才能做到这一点

注意:当平移发生水平时,我能够以编程方式找到。

【问题讨论】:

【参考方案1】:

有几种方法可以做到这一点:

    根据您的子视图的功能,您也许可以将其替换为滚动视图并将其锁定为仅垂直滚动。 (而超级应该只水平滚动)。 如果平移手势水平移动,您可以尝试将触摸信息从子视图馈送到其父视图。您可以使用委托模式来执行此操作,或者,如果您知道自己的超级视图是什么,只需在子视图中访问 superview。但是,这会在两个视图之间产生强烈的耦合,可能不应该这样做。它会很脆弱,许多人会认为它有代码味道。 (最佳选择)- 子类UIGestureRecognizer 并创建您自己的仅识别垂直运动的手势识别器。使用它而不是 UIPanGestureRecognizer

选项 3 是最好的,但可能是最有效的。您需要阅读 Apple 的关于子类化 UIGestureRecognizer: Apple Docs - UIGestureRecognizer 的文档。

我还编写了自己的拖动手势识别器FlxDragGestureRecognizer.m、FlxDragGestureRecognizer.h(类似于平移手势识别器),如果您愿意,可以使用它,或者看看以获得一个好主意如何继承UIGestureRecognizer。您可以使用此类来识别仅在某些方向上移动的触摸,否则它将失败(这将允许其他手势识别器识别,例如滚动视图)。它还收集了许多其他自定义项和信息,例如速度。

【讨论】:

【参考方案2】:

既然您已经知道如何检测平移,那么您将需要在您的超级视图中实现一个委托协议,在您的子视图中实现一个委托属性并将您的超级视图分配为您的子视图的委托。

当检测到水平平移时,调用委托方法,当检测到垂直平移时,在子视图中实现你想要的。

【讨论】:

以上是关于在某些情况下让 superview 响应 subView 的 UIPanGesture的主要内容,如果未能解决你的问题,请参考以下文章

如何允许某些手势通过 superview 到它下面的视图?

在linux里修改了环境变量或者某些配置文件之后,怎么在不重开终端的情况下让修改起作用?

超出superView的subview响应方法

想要在没有按钮的情况下让共享的 pref 工作

如何在不冻结整个线程的情况下让函数等待

如何在没有注册的情况下让喜欢更新?