drawRect
UIView サブクラスを使用してカスタム描画に取り組んできました。それはクールですが、drawRect が呼び出されるには実行ループの最後まで待たなければなりません。時間の経過とともに描画を変更するフレームごとのアニメーションをどのように制御できるのか、またはこれが可能かどうか疑問に思っています。おそらく、Quartz はこの種のアニメーション グラフィック用に設計されていないのでしょうか? おそらく、それほど頻繁に変更されない静的な描画用に設計されていると思います。
2 に答える
Quartz は、毎回すべてを再描画する必要があるため、高いフレームレートを維持することはできません。ただし、Quartz を CoreAnimation と連携させて、Quartz ベースのアニメーションを作成できます。この背後にある考え方は、以前に描画されたコンテンツを CALayer オブジェクト内にキャッシュし、CoreAnimation を使用して連続描画効果を作成できるというものです。
この手法の良い例は、Apple が提供する AccelerometerGraph サンプル コードで見ることができます。このサンプル内で、この手法を使用する UIView サブクラスは "GraphView" オブジェクトです。基本的に、このオブジェクトはグラフの一部 (新しく生成されたセグメント) のみを完全に新規に描画し、それを専用のレイヤーに戻してから、「スクロール グラフ」アニメーションを提供するためにレイヤーをアニメーション化します。
明らかに、この手法は、描画要素を完全に制御でき、画面にオブジェクトを追加する段階的な方法を管理できる場合にのみ機能します。もちろん、画面のさまざまな部分を再描画する必要があり、以前に生成されたレイヤーを変更する必要がある場合、事態はさらに複雑になります。
とにかく、前述のコードを見てください。非常に興味深いものです。
アプリは、各フレームの前に実行ループを終了する必要があります。各フレーム間ですべてのカスタム フレーム アニメーション設定を行います。したがって、drawRect でのフレームごとの描画は問題なく動作するはずです。これは、フレーム時間間のすべてのメソッドと drawRects が十分に高速である限り、静的ビューだけでなく、60 Hz のフレーム更新レートで iOS アプリで機能します。必要に応じてみじん切りにします。