2012-04-14 7 views
1

私はUIViewサブクラスでdrawRectを使用してカスタム図面を作成しています。それは素晴らしいですが、描画ループが終了するまで待つ必要があります。drawRectを呼び出すためには、フレームをフレームアニメーションでどのように制御できますか?おそらく、Quartzは実際にこのタイプのアニメーショングラフィックス用に設計されていませんか?私はおそらくそれほど頻繁に変化しない静的図面のために設計されているかもしれないと思います。Quartzによる連続描画ですか?フレームごとに可能ですか?

答えて

2

クォーツ自体は、毎回すべてを再描画する必要があるため、高いフレームレートを維持できません。しかし、QuartzにCoreAnimationを連動させることで、Quartzベースのアニメーションを作成することができます。この背後にある考え方は、CALayerオブジェクト内に以前に描画されたコンテンツをキャッシュし、次にCoreAnimationを使用して連続的な描画エフェクトを作成できるということです。

この手法の良い例は、AccelerometerGraph sample code provided by Appleにあります。このサンプルの中で、このテクニックを使用するUIViewサブクラスは "GraphView"オブジェクトです。基本的にこのオブジェクトは、グラフの一部(新しく生成されたセグメント)を完全に新しいものとして描画し、それを専用レイヤーにバックアップし、レイヤーをアニメーション化して「スクロールグラフ」アニメーションを提供します。

明らかに、このテクニックは、描画要素を完全に制御しているときにのみ機能し、画面内にオブジェクトを追加するこの増分方法を管理できます。もちろん、画面のさまざまな部分を再描画する必要があり、以前に生成されたレイヤーを変更する必要がある場合は、はるかに複雑になります。

とにかく上記のコードを見てください:それはかなり面白いです。

+0

提案に感謝してありがとう – johnbakers

1

アプリは、各フレームの前に実行ループに戻る必要があります。すべてのカスタムフレームアニメーションを各フレーム間で設定します。 drawRectのフレームごとの描画はうまくいくはずです。これは、静的ビューだけでなく、フレーム時間とdrawRects間のすべてのメソッドが十分に速い限り、iOSアプリケーションで60 Hzのフレーム更新レートで動作します。必要に応じてそれらを切ります。

+0

実行ループが終了して新しいフレームが開始されたときには理解できないと思います。フレームアニメーションロジックはどこに置くのですか?たとえば、 'for'ループは同じ実行ループ内で終了します。したがって、forループ内の 'setNeedsDisplay'への繰り返し呼び出しは機能しません...描画は、ループが終了したときにのみ発生します。 – johnbakers

+0

@andrewx:forループと、forループを含むメソッドを終了し、実行ループがいくつかの描画を実行できるようにフレームごとに終了する必要があります。後続の別のメソッド呼び出しで、forループロジックに戻ることができます。いくつかの状態を保存して復元する必要があるかもしれません。 – hotpaw2

+0

私は実行ループの管理について多くのことを学ぶ必要があるように聞こえます:) – johnbakers

関連する問題