0

我正在使用UIBezierPath. 我想在上面绘制它,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];
    }
}
4

2 回答 2

0

您可以:

  1. 完全避免使用,CGLayerRef只需使用with方法drawRect绘制(或如 Wain 建议的那样,使用 Core Graphics 函数绘制圆)。UIBezierPathfill

  2. 添加 a CAShapeLayer,将其设置pathCGPathRefUIBezierPath然后将文本添加为​​ aCATextLayerUILabel子视图(在这种情况下,您根本不需要drawRect实现)。

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

于 2013-10-22T15:38:27.990 回答
0

从贝塞尔路径获取CGPath,然后使用CGContextAddPathand绘制CGContextStrokePath。您可能还想使用CGContextSetStrokeColorWithColor.

于 2013-10-22T13:06:35.217 回答