web-dev-qa-db-ja.com

iOSでsetNeedsDisplayを呼び出す必要があるのはいつですか?

IOSアプリを作成するとき、setNeedsDisplay?を呼び出す必要があるタイミングについて混乱しています。 UIの更新/再描画と関係があることは知っています。ただし、ビューを変更するたびにこれを呼び出す必要がありますか?

たとえば、呼び出す必要がありますか?

  • テキストフィールドのテキストをプログラムで変更した後
  • ビューの背景を変更するとき?
  • ViewDidLoadに変更を加えるとき
  • ViewDidAppearではどうですか?

この方法をいつ使用するかに関する一般的なガイドラインを教えてもらえますか?

62
Nosrettap

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

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

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

例:

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

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

126

本当に必要なのは、-setNeedsDisplayでコンテンツを描画するUIViewサブクラスで-drawRect:を呼び出すだけです。

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

11
Mike Weller

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

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

ただし、独自のビューを作成する場合は、独自のdrawRect:、および何かが変更されたときに、setNeedsDisplay:明示的に。

5
Wei Xiang

@Amogh Talpallikarがそれを明確にしていると思います。そして、もう1つだけ話したいことがあります。

実際のところ、パフォーマンスが低下する可能性があるため、本当に必要な場合を除いて、drawRectのオーバーライドは避けてください。これを参照できます https://yalantis.com/blog/mastering-uikit-performance/

フレーム、ボタンの位置、ラベルのみを変更したい場合は、setNeedLayoutまたはlayoutIfNeededを呼び出すことができます

2
Proton

ビューのカスタム描画が依存するプロパティを変更するときに、setNeedsDisplayを呼び出します。 drawRect:メソッドを明示的に強制的に呼び出します。

1
SuryaKantSharma