我应该如何在CGLayer上绘制UIBezierPath?

时间:2013-10-22 12:40:01

标签: ios objective-c core-graphics

我正在使用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];
    }
}

2 个答案:

答案 0 :(得分:0)

从贝塞尔曲线路径获取CGPath,然后使用CGContextAddPathCGContextStrokePath进行绘制。您可能还想使用CGContextSetStrokeColorWithColor

答案 1 :(得分:0)

你可以:

  1. 完全避免使用CGLayerRef,只需drawRect使用UIBezierPath方法绘制fill(或者如Wain建议的那样,使用Core绘制圆圈图形功能)。

  2. 添加CAShapeLayer,将其path设置为CGPathRef的{​​{1}},然后将文本添加为​​UIBezierPathCATextLayer子视图(在这种情况下,您根本不需要UILabel实施。)

  3. 我推断您担心重绘圆圈的效率,但是当您渲染文本时,无论如何都可能需要重新渲染圆圈。您可以随时保存对drawRect的引用或执行快照,但我不确定是否值得。你可以对它进行基准测试并查看