我正在尝试创建圆形和矩形交叉的遮罩区域。
我开始使用这个代码,似乎为面具区域创建了圆形和矩形的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来轻松确定点是否在路径内。 SOOOO,我刚刚通过计算创建了交集的NSBezierPath,并使用我的派生路径附加到masklayer bounds路径。有一种方法可以在没有计算的情况下实际获得交叉点NSBezierPath,但我不得不继续前进。谢谢你的尝试。
谢谢, 卡门
编辑:这是我打电话给“交叉路口”的例行程序。掩盖我的_map视图。如果您想尝试,请将_map更改为您的视图:
- (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];
}
答案 0 :(得分:0)
如果您的目标是两条路径的交叉点,则不应创建复合路径。将路径附加到另一个路径
会导致两条路径的联合 - 换句话说,它将具有{{的效果1}}
导致一个形状只包含两条路径所包围的区域的部分,如果使用奇偶规则则不会重叠 - 换句话说,它会产生{{1}的效果}。
相反,我建议您先将第一条路径AND
添加到图形上下文和剪辑
XOR
然后将第二条路径pathrect
添加到您的上下文并再次剪辑:
[pathrect addClip];
您现在可以在该上下文中使用任何填充规则,它将填充两个路径的交叉点(pathcirc
)。