我正在尝试创建一个圆形和矩形相交的遮罩区域。
我从这段代码开始,它似乎为掩码区域创建了一个圆形和矩形的XOR,但我只想要一个普通的旧and:
- (void)addMaskToHoleViewAtX:(CGFloat) x AtY:(CGFloat) y Radius:(CGFloat) kRadius {
CGRect bounds = holeView.bounds;
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = bounds;
maskLayer.fillColor = [UIColor blackColor].CGColor;
CGRect const rect = CGRectMake(CGRectGetMidX(bounds) - kRadius/2,
CGRectGetMidY(bounds) - kRadius,
kRadius,
2 * kRadius);
UIBezierPath *pathrect = [UIBezierPath bezierPathWithRect:rect];
CGRect const circ = CGRectMake(CGRectGetMidX(bounds) - kRadius,
CGRectGetMidY(bounds) - kRadius,
2 * kRadius,
2 * kRadius);
UIBezierPath *pathcirc= [UIBezierPath bezierPathWithOvalInRect:circ];
UIBezierPath *allPaths= [[UIBezierPath alloc] init];
[allPaths appendPath:pathrect];
[allPaths appendPath:pathcirc];
[allPaths appendPath:[UIBezierPath bezierPathWithRect:bounds]];
maskLayer.path = allPaths.CGPath;
maskLayer.fillRule = kCAFillRuleEvenOdd;
holeView.layer.mask = maskLayer;
holeView.center = CGPointMake(x, y);
}
有人能帮我做AND的语法吗?我想我可能需要使用addClip,但我不清楚如何使用上面的代码?
我的解决方案:在我看来,如果我能够想出如何使用addClip以一种方式解决这个问题,我实际上就不会得到交叉点的封闭NSBezierPath。我不喜欢这样做,因为还需要交叉点NSBezierPath来轻松确定点是否在路径内。很快,我刚刚通过计算创建了交叉点的NSBezierPath,并使用我的派生路径附加到masklayer边界路径。如果能有一种不用计算就能实际获得交叉点NSBezierPath的方法,那肯定会很好,但我不得不继续前进。谢谢你的尝试。
谢谢,卡门
编辑:这是我调用的例程,用于在_map视图上设置"交集"掩码。如果您想尝试以下操作,请将映射更改为您的视图(_M(:
- (void)addHoleSubview {
holeView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10000, 10000)];
holeView.backgroundColor = [UIColor colorWithRed:255 green:0 blue:0 alpha:0.2];
holeView.autoresizingMask = 0;
[_map addSubview:holeView];
[self addMaskToHoleViewAtX:100 AtY:100 Radius:50];
}
如果目标是两条路径的交叉点,则不应创建复合路径。将一条路径附加到另一条路径将
-
如果使用非零绕组数规则并且两条路径具有相同的方向,则导致两条路径的并集,或者换句话说,这将具有
AND
的效果 -
如果使用奇偶规则,则会导致仅包含两条路径所包围的区域中不重叠的部分的形状,或者换句话说,它将具有
XOR
的效果。
相反,我建议您首先将第一条路径pathrect
添加到图形上下文中,并剪辑
[pathrect addClip];
然后将第二条路径pathcirc
添加到上下文中并再次剪辑:
[pathcirc addClip];
现在,您可以在该上下文中使用任何填充规则,它将填充两条路径的交集(AND
(。