Objective c UIBEZIER遮罩的圆和矩形相交的路径

Objective c UIBEZIER遮罩的圆和矩形相交的路径,objective-c,uibezierpath,Objective C,Uibezierpath,我试图创建一个圆形和矩形相交的遮罩区域 我从这段代码开始,它似乎为遮罩区域创建了一个圆和矩形的异或,但我只想要一个普通的旧的和: - (void)addMaskToHoleViewAtX:(CGFloat) x AtY:(CGFloat) y Radius:(CGFloat) kRadius { CGRect bounds = holeView.bounds; CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.f

我试图创建一个圆形和矩形相交的遮罩区域

我从这段代码开始,它似乎为遮罩区域创建了一个圆和矩形的异或,但我只想要一个普通的旧的和:

- (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);
}
有人可以帮我做语法,我想我可能需要使用addClip,但我不清楚如何使用上面的代码来做

我的解决方案:在我看来,如果我能够想出如何使用addClip以一种方式解决这个问题,我实际上不会得到交叉点的封闭路径。我不喜欢这样做,因为还需要交叉点NSBezierPath来轻松确定点是否在路径内。所以,我刚刚通过计算创建了交叉点的NSBezierPath,并使用我的导出路径附加到masklayer边界路径。如果有一种不用计算就能得到交叉点的方法,那当然很好,但我不得不继续前进。谢谢你的努力

谢谢, 卡门

编辑:下面是我调用的例程,用于将“交叉点”遮罩覆盖在我的地图视图上。如果要尝试以下操作,请将_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];
}

如果目标是两条路径的交点,则不应创建复合路径。将一条路径附加到另一条路径将

如果使用非零绕组编号规则,并且两条路径具有相同的方向,则会导致两条路径的并集,或者换句话说,它将具有and的效果

如果使用奇偶规则,则生成的形状仅包含由两条路径包围的区域中不重叠的部分,或者换句话说,它将具有异或的效果

相反,我建议您首先将第一个路径pathrect添加到图形上下文和剪辑中

[pathrect addClip];
然后将第二条路径pathcirc添加到上下文中,并再次剪辑:

[pathcirc addClip];

现在,您可以在该上下文中使用任何填充规则,它将填充两条路径的交点。

您可以画一幅您所追求的东西的图片吗?一个圆和一个矩形的交集是什么样子的?乍一看,我会说XOR行为是因为你在蒙版图层上使用了kCAFillRuleEvenOdd。Hi matt,交集根据相对位置而变化。我所编码的位置应该是一个弧形的顶部和底部,有两条垂直的边。David,我认为需要kCAFillRuleEvenOdd来生成一个遮罩,我试图获得的这个交点从遮罩层中减去,以便为下面的视图提供一个清晰的窗口,CarmenI不明白为什么你写的东西会有一个弧形的顶部和底部以及两个垂直的侧面。如果圆大于正方形,则生成的路径就是圆-所有边都将是圆形的。如果你不想要圆的边,那就由你来决定,首先不要画圆的边。现在已经只有一条路径了——它是复合路径,但它只是一条路径。谢谢,米沙,我相信你已经给了我答案,但我不知道我的图形上下文是什么,是masklayer吗?我在任何地方都尝试过addClips,所以我想我只是不理解这个过程。是否多次设置holeView.layer.mask?Carmen@Carm100:事实上,我不确定我是否已经给了你答案。我只是觉得这可能会有帮助,或者在正确的方向上给出一个提示。我建议的方法适用于“真实绘图”,即当您有图形上下文时。然后,您可以使用[path addClip]轻松地使用任何路径裁剪整个上下文,然后使用任何颜色填充路径。但是,您需要的不仅仅是一个裁剪的形状,而是一个“真实”裁剪的路径,这样您就可以将该特定路径用作图层遮罩。我必须承认,经过一些研究之后,我仍然没有找到一种实现这一目标的方法。@matt:你说得对。我的公式有点马虎。我已经更新了我的答案。