5

私は Quartz 2D を理解しようとしており、オンラインブックQuartz 2D Graphics for Mac OS X Developersを見ています。

私を混乱させている非常に基本的なことの 1 つは、CGContext です。たとえば、次のコードを使用して単純な「U」形状を描画し、 aCAShapeLayerを参照せずに a で使用できますCGContext。コンテキストは、デフォルトで暗示/提供されていCAShapeLayerますか?

ここでいくつかの iOS/OSX グラフィックス API を混同している可能性があるため、どこが間違っているのかを誰かが明確にすることができます。

CGPoint pt1 =  CGPointMake(100, 100);
CGPoint pt2 =  CGPointMake(150, 100);
CGPoint pt3 =  CGPointMake(150, 200);
CGPoint pt4 =  CGPointMake(190, 200);
CGPoint pt5 =  CGPointMake(190, 100);
CGPoint pt6 =  CGPointMake(210, 100);
CGPoint pt7 =  CGPointMake(210, 250);
CGPoint pt8 =  CGPointMake(100, 250);
CGPoint pt9 =  CGPointMake(100, 100);

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, nil, pt1.x,pt1.y);
CGPathAddLineToPoint(path, nil, pt2.x, pt2.y);
CGPathAddLineToPoint(path, nil, pt3.x, pt3.y);
CGPathAddLineToPoint(path, nil, pt4.x, pt4.y);
CGPathAddLineToPoint(path, nil, pt5.x, pt5.y);
CGPathAddLineToPoint(path, nil, pt6.x, pt6.y);
CGPathAddLineToPoint(path, nil, pt7.x, pt7.y);
CGPathAddLineToPoint(path, nil, pt8.x, pt8.y);
CGPathAddLineToPoint(path, nil, pt9.x, pt9.y);

CAShapeLayer *shapeLayer = [CAShapeLayer layer];
[self.view.layer addSublayer:shapeLayer];
4

1 に答える 1

5

はい、CAShapeLayer はパスをコンテキストに描画します。

CAShapeLayer では CG Pathを使用しますが、自分でコンテキストに描画する場合は、代わりに CG Context独自のパス描画関数を使用することをお勧めします。

最大の違いは、CGContext パス関数がコマンドをコンテキストの現在のパスに直接追加し、パスを塗りつぶすかストロークする (または明示的に放棄する) ようにコンテキストに指示すると破棄されるのに対し、CGPath オブジェクトは再び再利用できるようにコマンドを保持することです。また、たとえば CAShapeLayer の描画プロパティを変更した場合などです。

もちろん、コンテキストに描画する場合でも CGPath を使用する場合があります。コマンドのセットが変更されない場合、それは潜在的な最適化です。パスの変換が簡単になります。後でそのコマンドを繰り返すことができます (たとえば、それらをファイルにエクスポートするため)。また、UIBezierPath を使用して (つまり、Objective-C メッセージを使用して) プロット コードを記述し、CGPath を要求することもできます。

どちらの方法でも CGContext を使用することは間違いではなく、おそらくそれが最適な場合もありますが、ほとんどの目的では CAShapeLayer が最も簡単な方法です。特に Cocoa Touch では、すべての UIView が CAShapeLayer を配置できる CALayer によってサポートされています。 .

于 2013-02-03T00:03:17.920 に答える