我正在尝试绘制一个椭圆形挖空的320x480矩形。 想象一下,在矩形上绘制一个填充的矩形,一个填充的椭圆,然后从矩形中移除椭圆,留下一个透明孔。
- (void)drawRect:(CGRect)rect
{
// Drawing code.
CGContextRef context = UIGraphicsGetCurrentContext();
// Set color to red
CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0);
// Add rectange
CGContextAddRect(context, rect);
// Fill rectange
CGContextFillRect(context, rect);
// Create a elipse to be removed from rectange
CGPathRef circlePath = CGPathCreateMutable();
CGPathAddEllipseInRect(circlePath , NULL , elipseRect);
CGContextAddPath(context, circlePath);
CGContextSetRGBFillColor(context, 1.0, 1.0, 0.0, 1.0);
CGContextFillPath(context);
// clip elipse... (DO NOT WORK)
CGContextEOClip(context);
}
当我尝试从矩形移除椭圆时,它不起作用。
有人有解决方案吗?
答案 0 :(得分:12)
这不是我的头脑,但是......
CGPathRef cutoutRect = CGPathCreateMutable();
CGPathAddRect(cutoutRect, NULL, rect);
CGPathAddEllipseInRect(cutoutRect, NULL, ellipseRect);
CGContextAddPath(context, cutoutRect);
CGContextSetRGBFillColor(context, 1.0, 1.0, 0.0, 1.0);
CGContextFillPath(context);
您实际上可能需要使用CGContextEOFillPath
,我绝不能keep them straight。 {/ 1}}类型函数应该在绘图之前使用而不是之后,但在这种情况下它们可能不是必需的。
也就是说,您不应该在CGContextClip
实现中执行此操作,但路径应设置在-drawRect:
上,该CAShapeLayer
是此视图的子图层,或者是其唯一的图层,或者,实际上,如果可能的话,使用一个代替此视图的层。
另请注意,传递到drawRect:
的矩形可能只是整个视图的一部分,因此您的代码将会有一些非常奇怪的结果。您的意思是self.bounds
吗?