67

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

たとえば、次のように呼び出す必要がありますか。

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

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

4

5 に答える 5

130

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

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

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

例:

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

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

于 2012-05-30T14:32:23.950 に答える
11

-setNeedsDisplayでコンテンツを描画する UIView サブクラスを呼び出すだけで十分-drawRect:です。

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

于 2012-05-30T14:33:15.323 に答える
6

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

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

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

于 2012-05-30T14:40:24.757 に答える