2009-03-05 4 views
5

私はiPhoneアプリケーションで簡単なペイント機能を実装しようとしています。ビットマップブラシでビットマップを更新しようとしましたが、私もthis tutorialを試しました。touchesMovedに追いつくのに十分な速さで描画できないのですか?

どちらの方法は、コードがほぼ完全に異なっていても、同じ問題を抱えています。それはデバイス上でのみ発生します - シミュレータは正常に動作します。

私は画面をタッチし、私の指を動かすと、画面が更新されません。一時停止または指を持ち上げると、画面が更新されます。これは非常に良いユーザーエクスペリエンスではありません!

touchesMovedから直接drawRectを呼び出そうとしましたが、多くの呼び出しで描画コンテキスト(UIGraphicsGetCurrentContextを使用して取得)が無効であることがわかりました。

アイデア?任意の助け

おかげで、これは非常にイライラされています!

ヘニング

答えて

0

あなたが直接drawRectを呼び出すことはできません:。オンデマンドで画面をリフレッシュするには、へのコールに適切なコンテキストを設定するtouchesMovedメソッドから[self setNeedsDisplay]を呼び出してみてください。

+0

ありがとうございましたが、touchesMovedから[self setNeedsDisplay]を実行しようとしました。それは助けになりませんでした。 – Henning

2

あなたがメイン実行ループに表示を更新する機会を与えていないようにそれは私に聞こえます。あなたの描画コードは、タッチイベント間の時間よりも実行に時間がかかることがあるので、ディスプレイは決して更新されません。指を持ち上げると、図面に負担がかからなくなるため、更新が行われます。

NSOperationQueueのようなものを使用して、描画の重い計算をバックグラウンドスレッド上で実行するためにキューに入れておくと、速度を上げるために描画を最適化する(たとえば、画面の汚れた領域内でのみ描画する)タッチ図面イベントを選択的にドロップして、応答をスムーズに保ちます。

1つの追加の可能性は別の方法であなたの重い描画コードを配置し、performSelectorを経由して、それを呼んでいる:withObject:afterDelayを、10ミリ秒(またはそれ以下)の遅延で。これにより、メインの実行ループに、現在の状態でディスプレイを更新する機会が与えられる可能性があります。私はこれをテストしていないが、私が正しく覚えていれば、私はこの仕事を見た。

+0

私はそれを試して、それがどうなるか見てみましょう。ありがとうございました。 – Henning

関連する問題