在UIView上挖一个洞

时间:2013-03-15 20:12:59

标签: ios xcode

我正在尝试使用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。这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

您可能希望覆盖充当叠加层的视图的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;方法。

从这里你可以看到该点是否在切出区域内,如果它返回NO。

您可以在此处看到this stackoverflow question,其中包含更多信息。

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