iOS 7 - 透明的 UIView 阻塞手势识别器

Posted

技术标签:

【中文标题】iOS 7 - 透明的 UIView 阻塞手势识别器【英文标题】:iOS 7 - transparent UIView blocking gesture recognizer 【发布时间】:2013-10-04 04:14:38 【问题描述】:

我有 2 个视图作为主视图的子视图。

主视图 | |--- 视图 A | |--- 视图 B

我在视图 A 中有一个带有框架 (0, 0, 50, 50) 的按钮, 以及视图 B 中带有框架 (200, 200, 50, 50) 的按钮。

视图 A 和视图 B 的背景颜色为零(因此它们都是透明的)。

并且所有视图都具有相同的框架。

我希望能够单击两个按钮,但只有视图 B 中的按钮是可单击的。 ios 6 并非如此。

有什么想法吗?

丑陋的解决方案:

我找到了我的问题的解决方案,我要做的就是让我的视图A和视图B成为PassThroughUIView,但是这是一个非常丑陋的解决方案,我想知道是否有更好的解决方案,不涉及更改我的视图类。

@implementation PassThroughUIView

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
    for (UIView *v in self.subviews) 
        CGPoint localPoint = [v convertPoint:point fromView:self];
        if (v.alpha > 0.01 && ![v isHidden] && v.userInteractionEnabled && [v pointInside:localPoint withEvent:event])
            return YES;
    
    return NO;


@end

【问题讨论】:

只需检查是否有任何视图与按钮重叠,通过更改视图的背景颜色。 您是否添加了任何手势识别器(UITapGestureRecognizer 或任何)? 就是这样,视图 A 与主视图重叠,视图 B 与视图 A 重叠(它们都具有相同的大小),我仍然希望它能够工作。 您找到解决该问题的方法了吗?我遇到了同样的问题。 不是一个好=/,但看看我刚刚接受的答案。 【参考方案1】:

我想出的唯一解决方案是将 UIView 子类化并实现:

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

    for (UIView *v in self.subviews) 
        CGPoint localPoint = [v convertPoint:point fromView:self];
        if (v.alpha > 0.01 && ![v isHidden] && v.userInteractionEnabled && [v pointInside:localPoint withEvent:event])
            return YES;
    
    return NO;

这个 UIView 将是一个“通过视图”

【讨论】:

以上是关于iOS 7 - 透明的 UIView 阻塞手势识别器的主要内容,如果未能解决你的问题,请参考以下文章

ios手势识别之拖拽

如何在视图透明的同时接收滑动手势?

创建一个捕捉点击但对所有其他手势透明的 UIView

重叠视图中的 ios 手势识别器

如何跳过最顶层视图的手势 - iOS

具有 UIView 作为子视图的 UICollectionView 的选择性手势识别