目标c-UIBezierPath的一个圆形和矩形交叉点的掩码



我正在尝试创建一个圆形和矩形相交的遮罩区域。

我从这段代码开始,它似乎为掩码区域创建了一个圆形和矩形的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(。

最新更新