我正在使用UIBezierPath
绘制Circle。我想在CGLayer
上绘制它,以便我可以在一些事件之后缓存圆圈并在其上绘制文本(通过调用setNeedsDisplay
)。我应该如何在CGContextRef上绘制UIBezierPath。我的代码在下面
- (void)drawRect:(CGRect)rect
{
// Drawing code
static CGLayerRef sTextLayer = NULL;
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGRect textBounds = CGRectMake(0, 0, 200, 100);
if (sTextLayer == NULL) {
sTextLayer = CGLayerCreateWithContext(ctx, textBounds.size, NULL);
CGContextRef textCtx = CGLayerGetContext(sTextLayer);
CGContextSetRGBFillColor (textCtx, 1.0, 0.0, 0.0, 1);
UIGraphicsPushContext(textCtx);
// Draw circle
UIBezierPath *circle = [UIBezierPath bezierPathWithOvalInRect:textBounds];
[[UIColor blackColor] setFill];
circle.lineWidth = 2.0;
[circle fill];
UIGraphicsPopContext();
}
if (self.drawString) {
UIFont *font = [UIFont systemFontOfSize:13.0];
NSString *string = @"HAPPY BIRTHDAY";
[string drawInRect:textBounds withFont:font];
}
}
答案 0 :(得分:0)
从贝塞尔曲线路径获取CGPath
,然后使用CGContextAddPath
和CGContextStrokePath
进行绘制。您可能还想使用CGContextSetStrokeColorWithColor
。
答案 1 :(得分:0)
你可以:
完全避免使用CGLayerRef
,只需drawRect
使用UIBezierPath
方法绘制fill
(或者如Wain建议的那样,使用Core绘制圆圈图形功能)。
添加CAShapeLayer
,将其path
设置为CGPathRef
的{{1}},然后将文本添加为UIBezierPath
或CATextLayer
子视图(在这种情况下,您根本不需要UILabel
实施。)
我推断您担心重绘圆圈的效率,但是当您渲染文本时,无论如何都可能需要重新渲染圆圈。您可以随时保存对drawRect
的引用或执行快照,但我不确定是否值得。你可以对它进行基准测试并查看