0

我有一个关于 Quartz 和裁剪区域的问题:

我想在这个矩形内有一个矩形 A 我想有一个矩形 B B 的填充物也切入 A:我希望 A 被 B 刺穿。在石英中做到这一点的最佳方法是什么?我真的不明白如何剪辑

4

2 回答 2

0

如果我理解正确,您想在较大的矩形内绘制一个较小的矩形,以便内部矩形是透明的。您可以通过绘制一个包含两个矩形作为子路径的路径的 CAShapeLayer 来实现这一点。不要忘记将图层的填充规则设置为kCAFillRuleEvenOdd.

尝试这样的事情:

CGRect rectA = CGRectMake(100, 100, 200, 200);
CGRect rectB = CGRectMake(150, 150, 100, 100);

UIBezierPath *path=[[UIBezierPath alloc] init];

// Add sub-path for rectA
[path moveToPoint:CGPointMake(rectA.origin.x, rectA.origin.y)];
[path addLineToPoint:CGPointMake(rectA.origin.x+rectA.size.width, rectA.origin.y)];
[path addLineToPoint:CGPointMake(rectA.origin.x+rectA.size.width, rectA.origin.y+rectA.size.height)];
[path addLineToPoint:CGPointMake(rectA.origin.x, rectA.origin.y+rectA.size.height)];
[path closePath];

// Add sub-path for rectB
[path moveToPoint:CGPointMake(rectB.origin.x, rectB.origin.y)];
[path addLineToPoint:CGPointMake(rectB.origin.x+rectB.size.width, rectB.origin.y)];
[path addLineToPoint:CGPointMake(rectB.origin.x+rectB.size.width, rectB.origin.y+rectB.size.height)];
[path addLineToPoint:CGPointMake(rectB.origin.x, rectB.origin.y+rectB.size.height)];
[path closePath];

// Create CAShapeLayer with this path
CAShapeLayer *pathLayer = [CAShapeLayer layer];
[pathLayer setFillRule:kCAFillRuleEvenOdd]; /* <- IMPORTANT! */
[pathLayer setPath:path.CGPath];
[pathLayer setFillColor:[UIColor blackColor].CGColor];

// Add the CAShapeLayer to a view
[someView.layer addSublayer:pathLayer];
于 2013-08-13T20:37:03.147 回答
0

我用这种简单的方法解决了:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 0);
    CGContextFillRect(context,self.bounds);
    CGContextAddRect(context, self.bounds);
    //Add cropped rectangle:
    CGContextAddRect(context, _croppedRegion);
    //Clip:
    CGContextEOClip(context);
    CGContextSetRGBFillColor(context, 255.0, 255.0, 255.0, 0.5);
    CGContextFillRect(context, self.bounds);
}
于 2013-08-14T07:48:28.887 回答