在 UIView 中挖一个洞

Posted

技术标签:

【中文标题】在 UIView 中挖一个洞【英文标题】:Cut a hole in UIView 【发布时间】:2013-03-15 20:12:59 【问题描述】:

我正在尝试使用 UIView 作为掩码添加到另一个 UIView 前面。我需要这个来创建我的应用程序的教程。这是代码:

UIView *baseView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
//self.view = baseView;
[self.view addSubview:baseView];
[baseView setBackgroundColor:[UIColor blackColor]];
baseView.userInteractionEnabled = YES;
baseView.alpha = 0.5;

CAShapeLayer *mask = [[CAShapeLayer alloc] init];
mask.frame = baseView.layer.bounds;
CGRect biggerRect = CGRectMake(mask.frame.origin.x, mask.frame.origin.y, mask.frame.size.width, mask.frame.size.height);
CGRect smallerRect = CGRectMake(200.0f, 500.0f, 300.0f, 200.0f);

UIBezierPath *maskPath = [UIBezierPath bezierPath];
[maskPath moveToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMaxY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMaxY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))];

[maskPath moveToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMaxY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMaxY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMinY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))];

mask.path = maskPath.CGPath;
[mask setFillRule:kCAFillRuleEvenOdd];
mask.fillColor = [[UIColor blackColor] CGColor];
baseView.layer.mask = mask;

这样我就有了一个黑色透明的UIView,上面有一个矩形孔。我想这样做,如果用户触摸 UIView 中除剪切部分之外的任何其他位置,则不会发生任何事情。如果用户触摸了剪切部分的任何位置,就好像用户触摸了它下面的 UIView。这甚至可能吗?

【问题讨论】:

看看这个类似的问答是否有帮助:[Cut transparent hole in UIView][1] [1]: ***.com/questions/9711248/… 【参考方案1】:

您可能想要覆盖用作叠加层的视图的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; 方法。

从这里可以看到该点是否在裁剪区域内,如果是则返回NO。

您可以在此处查看this *** question,了解更多信息。

The documentation 做了一个合理的工作来解释 pointInside:withEvent 和 hitTest:withEvent 之间的关系。

【讨论】:

你能详细解释一下吗?我从来没有遇到过这种方法 我已经更新了答案,增加了一些内容,这些内容应该有助于解释这种方法如何参与确定哪个视图应该响应触摸。 谢谢,是的,该方法完全符合我的要求!

以上是关于在 UIView 中挖一个洞的主要内容,如果未能解决你的问题,请参考以下文章

iOS在UIView中打洞不是正方形

通过移动 UIView 中的区域传递触摸事件

在 UIView2 上方显示 UIView1,但在 UIView1 上方显示 UIView2 输入方式

检测一个 UIView 是不是在父级中的另一个 UIView 后面

在 UIView 中隐藏非子 UIView

如何在容器(UIView)内居中对齐 2 个 UIView,而不将它们放在 UIView 内