あなたが求めているものへの3つのアプローチがあります。すべてを描画drawRect:
したり、複数のレイヤーを管理したり、画像を描画したりできます。それぞれに利点がありますが、パフォーマンスを損なわないように、最初に問題について正しく考える必要があります。
描画は常に行われます。何かが変わるたびに、やらなければならない描画がかなりたくさんあるかもしれません。通常は画面全体ではありませんが、それでも多くの描画が行われます。drawRect:
とdrawInContext:
は何度も呼び出すことができるため、効率的である必要があります。つまり、高価な計算をたくさんしたくないし、無駄な描画をたくさんしたくないということです。「役に立たない」とは、「画面外にあるか、他の図面によって隠されているため、実際には表示されない」ことを意味します。
したがって、通常の場合、実際の描画コードをに入れますが、通常はdrawRect:
データが変更されたときに、他の場所ですべての計算を行います。たとえば、データが変更されるたびに、ファイルを読み取ったり、座標を把握したり、CGPathを作成したりします(描画よりもはるかに少ない頻度である必要があります)。すべての結果をivarに保存してからdrawRect:
、最終結果を描画します。したがって、ループの例では、おそらくビューオブジェクトに画像のNSArrayがあり、drawRect:
それらすべてを順番に描画します。
別のアプローチは、画像ごとに個別のレイヤーを作成し、画像をコンテンツとして設定してから、レイヤーをビューにアタッチすることです。その時点で完了です。書く必要のある描画コードはもうありません。Quartzはレイヤーを非常に効率的に処理するため、これはさまざまな問題に対する非常に優れたソリューションになります。
最後に、すべてを1つの画像に合成してから、その画像を画像ビューに貼り付けるか、画像をビューに直接描画するか、画像をレイヤーにアタッチすることができます。これは、非常に複雑な描画(特にCGPathを使用)がある場合に適したソリューションです。新しい画像コンテキストを作成し、古い画像を新しいコンテキストに描画し、その上に描画してから、コンテキストから新しい画像を作成する必要があるため、常に状況を変更している場合、これはコストがかかる可能性があります。ただし、頻繁に変更されない複雑な図面には適しています。
しかし、あなたは正しいです、CGContextはキャンバスのようなものではありません。描画サイクルごとに再描画する必要があります。これは自分で行うことも、別のビューオブジェクト(UIImageViewなど)を使用して行うこともできます。しかし、それは何らかの方法で行われなければなりません。