2012-05-30 21 views
59

iPhone/iPadアプリを作成するとき、setNeedsDisplayを正確に呼び出す必要があるときは混乱していますか?私はそれがUIの更新/再描画と関係があることを知っています。しかし、私は自分の見解を変えるたびにこれを呼び出す必要がありますか?例えばいつiOSでsetNeedsDisplayを呼び出す必要がありますか?

は、私はそれを呼び出す必要があります:

  • ビューの背景を変更する場合、プログラムでテキストフィールド
  • にテキストを変更した後?
  • viewDidLoadを変更するとどうなりますか?
  • viewDidAppearではどうですか?

この方法をいつ使用するかに関する一般的なガイドラインがありますか?ありがとう

答えて

122

UIViewのサブクラスでdrawRectをオーバーライドする場合は、setNeedsDisplayを呼び出す必要があります。これは基本的に、線、画像、または矩形のような図形を描画するカスタムビューです。

この描画が依存するいくつかの変数に変更を加え、その変更を表すためにsetNeedsDisplayを呼び出す必要がある場合は、内部的にdrawRectを呼び出してコンポーネントを再描画するこのメソッドを呼び出す必要があります。

imageViewまたはUIButtonをサブビューとして追加するか、またはサブビューを変更する場合は、このメソッドを呼び出す必要はありません。

例:

あなたが移動円を表示するビューを持っている、のいずれかをタッチして、それを移動したり、タイマーベースのアニメーションかもしれません。 ここでは、指定された中心と半径で円を描くカスタムビューが必要です。 これらはインスタンス変数として保持され、その中心を変更することによって円を移動させるか、半径を大きくすることによって円を移動するように変更されます。

この場合、ループとタイマーでこれらの変数(中心または半径)を変更するか、またはtouchesEndedおよびtouchesMovedメソッドで指で行うことができます。 このプロパティの変更を反映するには、このビューを再描画してsetNeedsDisplayを呼び出す必要があります。

+0

私のビューのサブクラス内のレイヤーまたはビューのフレームを変更した後は同じですか? –

9

-drawRect:で内容を描画するUIViewサブクラスでは、-setNeedsDisplayを呼び出す必要があります。

ラベルや他の標準コントロールの場合、テキストを変更すると自動的にラベルが再描画されるため、これを自分で行う必要はありません。

5

setNeedsDisplay:は、ビューを明示的に更新したいときに呼び出す必要があります。内部フラグを設定するだけで、iOS UIシステムは適切な時点でdrawRect:を呼び出します。

プレゼンテーションを変更する可能性のあるプロパティを更新するときは、常に呼び出されるように思えます。しかし、そうではありません。ほぼすべての標準UIコントロールがこれを処理しています。標準のUIコンポーネント(ビュー)のプロパティを変更するたびに、setNeedsDisplay:が内部的にトリガされ、影響を受ける領域が再描画されると私は信じています。(リストされたすべての状況で)

しかし、あなた自身のビューを作成し、独自のdrawRect:を実装し、何かが変更されたときにそれを更新したい場合は、setNeedsDisplay:を明示的に呼び出す必要があります。

1

@Amogh Talpallikarはそれを明確にしていると思います。そして、私はちょうどもっと一つ話したいと思う。

実際には、パフォーマンスが低下する可能性があるため、必要がない限り、drawRectを無効にする必要があります。あなただけのwannaの変更フレーム、ボタンの位置、ラベル場合、あなたはどのビューのカスタムのプロパティを変更しているとき...あなたはsetNeedLayoutまたはlayoutIfNeeded

関連する問題