UIView alpha 0但仍然接收触摸事件?
我试图隐藏一个uiview但仍然接受触摸事件。 我将alpha设置为0,如下所示:
mainView.alpha = 0.0
我也尝试将其设置为true,但它没有做任何事情
mainView.userInteractionEnabled = true
麻烦的是,当我这样做时,它不再接收触摸事件。 如何使其能够接收触摸事件但有效隐藏?
将你的UIView
的backgroundColor
为UIColor.clear
。
mainView.backgroundColor = .clear
有两种方法可以解决这个问题:
-
艰难的 – 而不是在视图上设置alpha,在其所有子视图上设置它并使视图中的所有内容不可见(例如,将背景更改为清除颜色)。
-
简单的 – 让另一个视图处理事件。 只需添加另一个具有相同位置和大小的透明视图(这很容易使用约束)来处理事件。
顺便说一下,如果你查看方法hitTest的文档:withEvent:用于处理触摸事件,它表示alpha
低于0.01
视图将不会接收到触摸。
隐藏视图的所有子视图,并将backgroundColor设置为UIColor clearColor
您在寻找透明视图吗?
只需从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