小编典典

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

all

假设我们有一个带有一个子视图的视图控制器。子视图占据屏幕的中心,四周有 100 px
的边距。然后,我们在该子视图中添加了一些小东西来点击。我们只是使用子视图来利用新框架(子视图中的 x=0, y=0 实际上是父视图中的 100,100)。

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

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


阅读 148

收藏
2022-07-09

共1个答案

小编典典

为您的容器创建一个自定义视图并覆盖 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

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

2022-07-09