14

drawRectiOSでは、を使用して線を引くことができます

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextBeginPath (context);
CGContextMoveToPoint(context, 0, 0);
CGContextAddLineToPoint(context, 100, 100);
CGContextStrokePath(context);

ただし、上記のコードを削除して、次のコードを使用するだけで、長方形を描画することもできます。

UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)];
[path stroke];

2つの関連する質問:

UIBezierPath1)現在のコンテキストを取得または使用する必要 がないのはなぜですか?

2)2つのコンテキストがある場合(1つは画面用、もう1つはビットマップコンテキスト)、どのコンテキストに描画するかをどのように指示するのUIBezierPathですか?あるかもしれないと思いましたがUIGraphicsSetCurrentContext、存在しません。

4

3 に答える 3

22

UIBezierPathコンテキストを使用します。現在の UIKit グラフィック コンテキストを使用します。これは、すでに取得しているものとまったく同じですUIGraphicsGetCurrentContext()

UIBezierPath別のコンテキストを使用したい場合はを使用できますがUIGraphicsPushContext()、完了したら使用することを忘れないでUIGraphicsPopContext()ください。

于 2012-05-19T19:30:41.067 に答える
6

CGContextFillRectは、私が知る限り、UIBezierPathを使用するよりも約8.5倍高速であることに言及するのが役立つと思いました(パフォーマンスが要因であり、より複雑な描画にUIBezierPathを使用する必要がないと仮定した場合)。

AppleのHazardMapの例(http://developer.apple.com/library/ios/#samplecode/HazardMap/Introduction/Intro.html)にタイミングを追加しました。また、CGContextFillRectの場合、rectあたりのミリ秒単位の時間は〜0.00064 ms/rectです。アプローチ対UIBezierPathアプローチの〜0.00543 ms / rect、おそらく後者はより多くのメッセージパッシングオーバーヘッドを必要とします。

つまり、私はを使用して比較しています

CGContextFillRect(ctx, boundaryCGRect);

対使用

UIBezierPath* path = [UIBezierPath bezierPathWithRect:boundaryCGRect];
[path fill];

HazardMapViewの内部ループ内(さらに、HazardMapViewに渡されるコンテキストをプッシュ/ポップするための上記の変更drawMapRect:zoomScale:inContext:)。

ETA

于 2012-10-24T15:23:38.483 に答える
5

iOSでは、使用して線を引くことができdrawRectます

この声明の重要な部分を強調しました。の内部ではdrawRect:、UIKit によってコンテキストが既に設定されており、オブジェクトベースの描画命令はそのコンテキストに直接入ります。UIBezierPath実際にそのコンテキストを使用していますが、明示的に渡す必要はありません。

Cocoa Touch では、常に描画コンテキストが必要です (この場合、コンテキストは最終的に画面に描画されます)。の中にいない場合はdrawRect:、自分でコンテキストを作成する必要があります。

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextBeginPath (context);
CGContextMoveToPoint(context, 0, 0);

最初の関数呼び出しはGetCurrentContext()であることに注意してください。CoreGraphics の関数描画インターフェイスを使用している場合、各関数にコンテキストを渡す必要がありますが、ここでは作成していません。既存のものを取得しているだけです。

グラフィックス コンテキストはスタックにあります。作成したコンテキストに描画したい場合は、UIGraphicsPushContext()(Kevin が既に述べたように) を使用してそれをスタックにプッシュしてから、前のコンテキストに戻ります。

于 2012-05-19T19:35:43.640 に答える