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. を追加し、そのを のにCAShapeLayer設定してから、テキストをまたはサブビューとして追加します (この場合、実装はまったく必要ありません)。pathCGPathRefUIBezierPathCATextLayerUILabeldrawRect

円の再描画の効率が心配だと思いますが、テキストをレンダリングするときは、とにかく円を再レンダリングする必要があります。への参照を保存したり、スナップショットを作成したりすることはいつでもできますが、UIBezierPathそれだけの価値があるかどうかはわかりません。ベンチマークして確認できます。

于 2013-10-22T15:38:27.990 に答える
0

CGPathベジエ パスから を取得し、と を使用CGContextAddPathして描画しCGContextStrokePathます。を使用することもできますCGContextSetStrokeColorWithColor

于 2013-10-22T13:06:35.217 に答える