用于掩模的圆形和矩形交叉的UIBezierPath

时间:2014-05-01 14:19:00

标签: objective-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来轻松确定点是否在路径内。 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];
}

1 个答案:

答案 0 :(得分:0)

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

    如果使用非零绕组数规则并且两条路径具有相同的方向,则
  • 会导致两条路径的联合 - 换句话说,它将具有{{的效果1}}

  • 导致一个形状只包含两条​​路径所包围的区域的部分,如果使用奇偶规则则不会重叠 - 换句话说,它会产生{{1}的效果}。

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

XOR

然后将第二条路径pathrect添加到您的上下文并再次剪辑:

[pathrect addClip];

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