IOSアプリを作成するとき、setNeedsDisplay
?を呼び出す必要があるタイミングについて混乱しています。 UIの更新/再描画と関係があることは知っています。ただし、ビューを変更するたびにこれを呼び出す必要がありますか?
たとえば、呼び出す必要がありますか?
この方法をいつ使用するかに関する一般的なガイドラインを教えてもらえますか?
UIViewのサブクラスでdrawRectをオーバーライドする場合にのみ、setNeedsDisplayを呼び出す必要があります。UIViewは、基本的に画面上に線、画像、長方形などの図形を描画するカスタムビューです。
したがって、この図面が依存するいくつかの変数を変更する場合はsetNeedsDisplayを呼び出す必要があり、その変更を表示するビューでは、内部でdrawRectを呼び出してコンポーネントを再描画するこのメソッドを呼び出す必要があります。
ImageViewまたはUIButtonをサブビューとして追加したり、サブビューに変更を加えたりする場合、このメソッドを呼び出す必要はありません。
例:
動いている円を表示するビューがあり、それをタッチして移動するか、タイマーベースのアニメーションにすることができます。これには、指定された中心に、指定された半径で円を描くカスタムビューが必要になります。これらはインスタンス変数として保持され、その中心を変更することで円を移動したり、半径を大きくすることで円を大きくしたりするように変更されます。
この場合、ループとタイマーでこれらの変数(中心または半径)を変更するか、touchesEndedメソッドとtouchesMovedメソッドで指で操作することができます。このプロパティの変更を反映するには、setNeedsDisplayを呼び出すこのビューを再描画する必要があります。
本当に必要なのは、-setNeedsDisplay
でコンテンツを描画するUIViewサブクラスで-drawRect:
を呼び出すだけです。
ラベルおよびその他の標準コントロールの場合、テキストを変更すると自動的にラベルが再描画されるため、これを自分で行う必要はありません。
setNeedsDisplay:
は、ビューを明示的に更新するときに呼び出す必要があります。内部フラグを設定するだけで、iOS UIシステムはdrawRect:
後で適切なタイミングで。
プレゼンテーションを変更する可能性のあるプロパティを更新するときは、常に呼び出す必要があるようです。しかし、そうではありません。ほとんどすべての標準UIコントロールがすでにそれを処理しました。標準のUIコンポーネント(ビュー)のプロパティを変更するたびに、setNeedsDisplay:
は内部的にトリガーされ、影響を受ける領域は再描画されます。 (リストしたすべての状況で)
ただし、独自のビューを作成する場合は、独自のdrawRect:
、および何かが変更されたときに、setNeedsDisplay:
明示的に。
@Amogh Talpallikarがそれを明確にしていると思います。そして、もう1つだけ話したいことがあります。
実際のところ、パフォーマンスが低下する可能性があるため、本当に必要な場合を除いて、drawRect
のオーバーライドは避けてください。これを参照できます https://yalantis.com/blog/mastering-uikit-performance/
フレーム、ボタンの位置、ラベルのみを変更したい場合は、setNeedLayout
またはlayoutIfNeeded
を呼び出すことができます
ビューのカスタム描画が依存するプロパティを変更するときに、setNeedsDisplayを呼び出します。 drawRect:メソッドを明示的に強制的に呼び出します。