18

これら2つの機能の違いを説明するための適切な答えが見つかりません。すべての人がいつ呼び出され、一方が他方とどのように異なるのですか?

たとえば、drawrect内にビューをレイアウトすることはできませんか?

ありがとう

4

2 に答える 2

59

-layoutSubviews-layoutIfNeeded「layoutneeded」フラグが設定されている場合から呼び出されます(を使用して-setNeedsLayout、またはビューの境界が変更されたときに自動的に)。ビューの配置に使用します[編集:サブビューの配置に使用します]。

-drawRect:-displayIfNeeded「必要な表示」フラグが設定されている場合から呼び出されます(を使用して-setNeedsDisplay、または設定した場合は自動的にview.contentMode = UIViewContentModeRedraw)。

両方とも-layoutIfNeeded-displayIfNeeded物事が画面に描画される前にUIKit/CoreAnimationによって自動的に呼び出されます。それらを直接呼び出す必要はめったにありません。

サブビューをに配置することはできますが-drawRect:(サブビューを追加することもできます!)、これは賢明ではありません。

  • デフォルトで-setNeedsDisplayは、境界の変更時に自動的に呼び出されることはありません。
  • 実装-drawRect:するとパフォーマンスが低下します(UIKit / CoreAnimationはビットマップに裏打ちされたグラフィックスコンテキストを作成する必要があります)。カスタム描画を実行する必要がある場合にのみ実行してください。
  • でビューを再描画する必要があります-drawRect:。描画は高価です。ビューを移動するのは安いです。
  • UIKit / CoreAnimationは、おそらくレイアウトパスとそれに続く描画パスを実行します。CoreAnimationは、レイアウト情報を使用して、描画が必要なビューを決定できます(たとえば、不透明なサブビュー、オフスクリーンビュー、またはclipsToBounds = YESビューの境界外のサブビューによって隠されたビューを無視できます。または、大きなビュー)。描画パス中にビューを移動すると、CoreAnimationがビューを正しく描画しない場合があります。

編集:そして私が目を覚ましているときのいくつかの詳細:

「表示」と「描画」の違いは何ですか?表示は-[CALayer display];によって行われます。デフォルトの実装は(およそ)です

  • レイヤーのデリゲートがに応答する場合は-displayLayer:、を呼び出します [self.delegate displayLayer:self]。(例)CGImage-displayLayer:に設定することになっています。layer.content
  • それ以外の場合、レイヤーのデリゲートが応答する場合は-drawLayer:inContext:、ビットマップに裏打ちされたコンテキストを設定し、を呼び出し[self.delegate drawLayer:self inContext:context]て、出力をに保存しますlayer.content(出力は実際にはCABackingStoreであり、おそらくプライベートAPIです)
  • それ以外の場合は、変更しないでくださいlayer.content

ビューはレイヤーのデリゲートであるため、代わりに実装して、次の-[MyView displayLayer:]ような興味深いことを行うことができます。

  • self.layer.contents = (id)([UIImage imageNamed:@"foo"].CGImage)(これはおおよそUIImageViewが行うことです)
  • 「描画」を防ぐためのノーオペレーション。これは、UIToolbarなどをサブクラス化していて、背景を透明にしたい場合に便利です。(これにより、CGContext / CABackingStoreの作成も防止されます。)
  • パフォーマンスを低下させることなくサブビューを移動します(ただし、上記の理由から、それでもお勧めできません)。
于 2010-09-25T01:17:31.850 に答える
-2

たぶん私はすべての答えを持っているわけではありませんが、私はあなたに言うことができます:-ビューフレームが変更されたときにlayoutSubviewsが呼び出されます-setNeedDisplayが呼び出されたときにdrawRectが呼び出されます

ほとんどの場合、layoutSubviewsは使用しません。

他の場合もあるかもしれませんが、それはあなたに最初の答えを与えるかもしれません^^

幸運を

于 2010-09-24T20:13:24.853 に答える