如何单击透明UIView后面的按钮?


176

假设我们有一个带有一个子视图的视图控制器。子视图占据屏幕中心,所有边距均为100 px。然后,我们添加一堆小东西以在该子视图中单击。我们仅使用子视图来利用新框架(子视图内的x = 0,y = 0实际上在父视图中为100,100)。

然后,假设我们在子视图后面有一些东西,例如菜单。我希望用户能够在子视图中选择任何“小东西”,但是如果那里什么也没有,我希望通过它触摸一下(因为无论如何背景都是清晰的),到达它后面的按钮。

我怎样才能做到这一点?看起来touchesBegan经历了,但是按钮不起作用。


1
我认为透明(alpha 0)UIViews不应该响应触摸事件吗?
伊万德·伍

1
我为此写了一小堂课。(在答案中添加了一个示例)。那里的解决方案比接受的答案要好一些,因为您仍然可以单击UIButton半透明下的,UIView而的非透明部分UIView仍会响应触摸事件。
塞格夫2015年

Answers:


314

为您的容器创建一个自定义视图,并覆盖pointInside:消息,以在该点不在合格的子视图中时返回false,例如:

迅速:

class PassThroughView: UIView {
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        for subview in subviews {
            if !subview.isHidden && subview.isUserInteractionEnabled && subview.point(inside: convert(point, to: subview), with: event) {
                return true
            }
        }
        return false
    }
}

目标C:

@interface PassthroughView : UIView
@end

@implementation PassthroughView
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    for (UIView *view in self.subviews) {
        if (!view.hidden && view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event])
            return YES;
    }
    return NO;
}
@end

将此视图用作容器将允许其任何子级接收触摸,但视图本身对事件是透明的。


4
有趣。我需要进一步研究响应者链。
肖恩·克拉克·赫斯

1
您需要检查视图是否也可见,然后还需要在测试子视图之前检查子视图是否可见。
懒惰的编码者2012年

2
不幸的是,此技巧不适用于不能更改视图的tabBarController。有人有想法使这种观点对事件透明吗?
cyrilchampier 2012年

1
您还应该检查视图的Alpha。通常,我会通过将alpha设置为零来隐藏视图。alpha值为零的视图的行为应类似于隐藏视图。
詹姆斯·安德鲁斯

2
我做了一个快速的版本:也许您可以将其包含在可见性的答案中gist.github.com/eyeballz/17945454447c7ae766cb
eyeballz 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.