UIView alpha 0但仍然接收触摸事件?

时间:2015-05-15 22:47:34

标签: ios swift uiview

我试图隐藏一个uiview但仍然让它接收触摸事件。我将alpha设置为0,如下所示:

mainView.alpha = 0.0

我也尝试将此设为真,但它没有做任何事情

mainView.userInteractionEnabled = true

麻烦的是,当我这样做时,它不再接收触摸事件。如何使其能够接收触摸事件但有效隐藏?

4 个答案:

答案 0 :(得分:13)

UIView backgroundColor设置为UIColor.clear

mainView.backgroundColor = .clear

答案 1 :(得分:1)

有两种方法可以解决这个问题:

  1. 硬盘 - 不是在视图上设置alpha,而是在其所有子视图上设置它,并使视图中的所有内容都不可见(例如,将背景更改为清晰颜色)。

  2. 简单的一个 - 让另一个视图处理事件。只需添加另一个具有相同位置和大小的透明视图(这很容易使用约束)来处理事件。

  3. 顺便说一句,如果您查看用于处理触摸事件的方法hitTest:withEvent:的文档,则表示alpha低于0.01的视图将不会接收到触摸。

答案 2 :(得分:1)

隐藏视图的所有子视图,并将backgroundColor设置为UIColor clearColor

答案 3 :(得分:-1)

您在寻找透明视图吗?

只需从UIView创建一个TransparantView子类并复制到代码下面。该视图将是透明的,但仍然可以接触到。您可能需要更改一些代码,因为我的代码处理其子视图。关键是重写pointInside以实现您的目标。

如果您只想要透明视图,那么此透明视图下的其他视图仍然可以通过透明视图获取触摸事件,您无法在transparentView中添加任何子视图。

扩展阅读是学习响应者链。

@implementation TransparantView

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    return self;
}

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

更新:

似乎iOS在将alpha设置为0时不会将事件分派给视图。但是,透明视图在屏幕上没有任何内容,就像它的alpha = 0一样。我已更新代码以修复错误

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