0

CGContextは直接描画するために呼び出すことができず、drawInContextに描画ロジックを入力し、「setNeedsDisplay」を使用して描画するためにCGContextを呼び出す必要があることを知っているので、実行するcmdを設計しましたが、いくつかの問題が発生します。 .. このような :

ループで描画できないのはなぜですか?(iPhoneでUIViewを使用)

CGContextは、以前のプログラミング経験とは大きく異なると思います。...(HTML5キャンバスを使用したので、描画後に詳細を追加できます。JavaSwingも同様です)実際、何が適切かを知りたいです。 Appleのプログラマーの心の中でこれらの種類のものを実装します。テラヘルツ。

4

1 に答える 1

6

あなたが求めているものへの3つのアプローチがあります。すべてを描画drawRect:したり、複数のレイヤーを管理したり、画像を描画したりできます。それぞれに利点がありますが、パフォーマンスを損なわないように、最初に問題について正しく考える必要があります。

描画は常に行われます。何かが変わるたびに、やらなければならない描画がかなりたくさんあるかもしれません。通常は画面全体ではありませんが、それでも多くの描画が行われます。drawRect:drawInContext:は何度も呼び出すことができるため、効率的である必要があります。つまり、高価な計算をたくさんしたくないし、無駄な描画をたくさんしたくないということです。「役に立たない」とは、「画面外にあるか、他の図面によって隠されているため、実際には表示されない」ことを意味します。

したがって、通常の場合、実際の描画コードをに入れますが、通常はdrawRect:データが変更されたときに、他の場所ですべての計算を行います。たとえば、データが変更されるたびに、ファイルを読み取ったり、座標を把握したり、CGPathを作成したりします(描画よりもはるかに少ない頻度である必要があります)。すべての結果をivarに保存してからdrawRect:、最終結果を描画します。したがって、ループの例では、おそらくビューオブジェクトに画像のNSArrayがあり、drawRect:それらすべてを順番に描画します。

別のアプローチは、画像ごとに個別のレイヤーを作成し、画像をコンテンツとして設定してから、レイヤーをビューにアタッチすることです。その時点で完了です。書く必要のある描画コードはもうありません。Quartzはレイヤーを非常に効率的に処理するため、これはさまざまな問題に対する非常に優れたソリューションになります。

最後に、すべてを1つの画像に合成してから、その画像を画像ビューに貼り付けるか、画像をビューに直接描画するか、画像をレイヤーにアタッチすることができます。これは、非常に複雑な描画(特にCGPathを使用)がある場合に適したソリューションです。新しい画像コンテキストを作成し、古い画像を新しいコンテキストに描画し、その上に描画してから、コンテキストから新しい画像を作成する必要があるため、常に状況を変更している場合、これはコストがかかる可能性があります。ただし、頻繁に変更されない複雑な図面には適しています。

しかし、あなたは正しいです、CGContextはキャンバスのようなものではありません。描画サイクルごとに再描画する必要があります。これは自分で行うことも、別のビューオブジェクト(UIImageViewなど)を使用して行うこともできます。しかし、それは何らかの方法で行われなければなりません。

于 2010-04-12T13:50:39.710 に答える