如果*** UIView 没有收到它想要处理的手势,则将手势/触摸传递给另一个 UIView?

Posted

技术标签:

【中文标题】如果*** UIView 没有收到它想要处理的手势,则将手势/触摸传递给另一个 UIView?【英文标题】:Pass gesture/touches to another UIView if top level UIView does not receive the gesture it wants to handle? 【发布时间】:2016-12-06 05:18:50 【问题描述】:

我在这里找到了一些类似的问题,但没有一个能满足我的要求。

我的问题是:我设置了一个带有控件、集合视图和其他一些东西的 UIView。标准的 ios 东西。

当用户在屏幕上进行两指平移时,搜索栏应该会从顶部下降,主 UIView 也会下降一点。

我试图实现这一点的方法是拥有一个位于顶层并拦截所有触摸和手势的 UIView。我希望它做的是忽略不是两个手指平移的手势,并将它们作为原始输入传递下去,以便应用程序的其余部分可以正常运行。

我不能简单地将平移手势识别器添加到根 UIView,因为集合视图似乎阻止了平移到根。

知道如何实现吗?

【问题讨论】:

你找到解决方案了吗? 【参考方案1】:

添加一个覆盖视图,只是为了使用平移手势,是一种矫枉过正的做法。如果您从此覆盖视图传递所有其他触摸(这绝对是可能的),您将解决错误的问题。 相反,您可以防止集合视图从根视图中窃取平移手势的触摸。为此,在根视图上添加平移手势后,遍历集合视图上的所有手势并使它们需要平移手势失败。在下面的代码中,假设panDownGesture 是您添加到根视图的两个手指向下平移。

for (UIGestureRecognizer *recognizer in self.collectionView.gestureRecognizers) 
    [recognizer requireGestureRecognizerToFail:panDownGesture];
 

这将避免集合视图在检测到平移手势时获取任何手势。

编辑:

从您的评论中得到提示,我使用上面显示的相同循环检查了集合视图上的所有默认手势。事实证明,集合视图已经有了maximumNumberOfTouches = 4294967295minimumNumberOfTouches = 1 的平移手势。这是与您的下拉手势相冲突的手势。为避免这种情况,只需将此平移手势的 maximumNumberOfTouches 更改为 1。您可以使用上述代码的修改版本来做到这一点:

for (UIGestureRecognizer *recognizer in self.collectionView.gestureRecognizers) 
    if ([recognizer isKindOfClass:[UIPanGestureRecognizer class]]) 
        ((UIPanGestureRecognizer)recognizer).maximumNumberOfTouches = 1;
    
    [recognizer requireGestureRecognizerToFail:panDownGesture];
 

警告:这不再允许用一根以上的手指平移集合视图。使用此代码,您处于一个有点危险的领域。您不仅使默认手势依赖于其他东西,而且正在改变它的工作方式。希望这不会对集合视图产生不利影响,并且您应该能够用一根手指滚动。祝你好运。

【讨论】:

不幸的是,这不起作用,因为 UICollectionView 开始表现出奇怪的行为 - 它不会跟随用户手指自行上下平移。 如果您为您的panDownGesture 设置了minimumNumberOfTouches = 2maximumNumberOfTouches = 2,单点触控将不会检测到平移。这将避免与任何其他视图上的所有其他手势发生冲突。当然,集合视图本身上的 2 个手指平移将不起作用。 我试过了,但我会根据滚动视图内容是否大于其边界而得到不同的行为(当内容小于其边界时似乎忽略它) @soshiki 检查我的 EDIT 之后的代码是否适合您。【参考方案2】:
#import "CustomUiView.h"

@implementation CustomUiView.h

-(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
    return NO;

@end

您不想交互的视图。 创建自定义 UIView 类并将此自定义视图用作在 pointInside 方法中返回 NO 的顶视图。然后触摸将自动进入地下。

【讨论】:

以上是关于如果*** UIView 没有收到它想要处理的手势,则将手势/触摸传递给另一个 UIView?的主要内容,如果未能解决你的问题,请参考以下文章

旋转手势改变视图框架

UIView 处理手势,内部 UIButton 应该捕捉触摸

如何以编程方式触发 UIView 的点击手势识别器

如何将手势识别器添加到collectionview单元格中的uiview

iOS 上的手势过滤

可以使用自定义 UIViewController 但没有自定义 UIView 类来实现手势识别吗?