1

UIBezierを持っていて、drawRectを使用してビューに描画すると、ベジェは一種の揮発性であることがわかります。つまり、実際にはどこにも描画されていません。代わりに、そのビューに表示されるものに対応する一種のバッファーに書き込まれたようなものです。つまり、[self setNeedsDisplay]を使用してdrawRectを再度呼び出すと、ベジェがなくなり、他のものを書き込むことができます。

一方、CGContextにlikeを描くと

CGContextStrokePath(ctx);

私は実際にそのコンテキストに行を書き込んでいますが、それを消去する方法はありません。同じメソッドを再度呼び出すと、すでに1本の線が描画されているコンテキストに上書きされます。

しかし、UIBezierコマンドを使用してCGContextに書き込むとどうなりますか?

つまり、私が次のようなことをすると

UIGraphicsPushContext(ctx);
CGContextSaveGState(ctx);
CGContextTranslateCTM(ctx, 0, height);
CGContextScaleCTM(ctx, 1.0, -1.0);
[myBezier stroke];
CGContextRestoreGState(ctx);
UIGraphicsPopContext();

この行は永続的にctxに書き込まれますか、それとも以前のように揮発性ですか?ドキュメントにはそれに関する情報が含まれておらず、いつものようにあいまいです。

ありがとう

4

2 に答える 2

1

ビューdrawRect:が呼び出されるたびに、UIKitは描画するためのグラフィックスコンテキストを設定します。そのため、ベジェパスは永続的ではないように見えます。ビューを表示する必要があるたびに、新しいコンテキストがあり、パスがそれに引き込まれます。したがって、を通過するたびdrawRect:に、特定のパスを描画しないことを決定でき、そのパスは表示されません。

コンテキストに追加されたパスを削除する方法はありませんが、次にビューが更新されたときに、ほとんど何も含まれていない新しいコンテキストがあります。独自のグラフィックスコンテキストを作成する場合、それに入れるものはすべて「永続的」です。つまり、コンテキストの存続期間中はそこにあります。

コンテキストは基本的に、「画像」を生成する描画命令で構成されます。画像が描画されるコンテキストの宛先は、画像ファイル、デバイス画面のセクション、場合によっては1枚の紙など、さまざまなものになる可能性があるため、これはあいまいです。コンテキストは、描画命令でいっぱいになると、宛先にレンダリングされます。

ビュー描画の場合、UIKitはそのコンテキストを設定し、を呼び出しますdrawRect:。ここにはある程度の間接参照があります。実際には「ビューに描画」することはなく、常にコンテキストに描画します。ビューは基本的に予約され、画面のセクションを表します。UIKitは、そのセクションに何を入れたいかを尋ね、その情報を伝えることができるようにグラフィックスコンテキストを提供します。次に、指示がいっぱいのコンテキストを取得し、それをピクセルデータに変換して、ビューで表される領域に描画します。

于 2011-06-12T04:16:42.500 に答える
1

UIBezierPathは、一連の線/曲線とそれらの描画方法に関する指示を含むクラスです。ベジェパスを描画すると、基本的にQuartzの他の描画機能と同じように機能します。コンテキストのコンテンツは、コンテキストの存続期間中存続します(ビットマップコンテキストの場合、これはメモリ内のビットマップの存続期間です。ビューコンテキストの場合、「ビューを再描画する必要があるまで」です)。

于 2011-06-12T02:55:33.357 に答える