これら2つの機能の違いを説明するための適切な答えが見つかりません。すべての人がいつ呼び出され、一方が他方とどのように異なるのですか?
たとえば、drawrect内にビューをレイアウトすることはできませんか?
ありがとう
これら2つの機能の違いを説明するための適切な答えが見つかりません。すべての人がいつ呼び出され、一方が他方とどのように異なるのですか?
たとえば、drawrect内にビューをレイアウトすることはできませんか?
ありがとう
-layoutSubviews
-layoutIfNeeded
「layoutneeded」フラグが設定されている場合から呼び出されます(を使用して-setNeedsLayout
、またはビューの境界が変更されたときに自動的に)。ビューの配置に使用します[編集:サブビューの配置に使用します]。
-drawRect:
-displayIfNeeded
「必要な表示」フラグが設定されている場合から呼び出されます(を使用して-setNeedsDisplay
、または設定した場合は自動的にview.contentMode = UIViewContentModeRedraw
)。
両方とも-layoutIfNeeded
、-displayIfNeeded
物事が画面に描画される前にUIKit/CoreAnimationによって自動的に呼び出されます。それらを直接呼び出す必要はめったにありません。
サブビューをに配置することはできますが-drawRect:
(サブビューを追加することもできます!)、これは賢明ではありません。
-setNeedsDisplay
は、境界の変更時に自動的に呼び出されることはありません。-drawRect:
するとパフォーマンスが低下します(UIKit / CoreAnimationはビットマップに裏打ちされたグラフィックスコンテキストを作成する必要があります)。カスタム描画を実行する必要がある場合にのみ実行してください。-drawRect:
。描画は高価です。ビューを移動するのは安いです。編集:そして私が目を覚ましているときのいくつかの詳細:
「表示」と「描画」の違いは何ですか?表示は-[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が行うことです)たぶん私はすべての答えを持っているわけではありませんが、私はあなたに言うことができます:-ビューフレームが変更されたときにlayoutSubviewsが呼び出されます-setNeedDisplayが呼び出されたときにdrawRectが呼び出されます
ほとんどの場合、layoutSubviewsは使用しません。
他の場合もあるかもしれませんが、それはあなたに最初の答えを与えるかもしれません^^
幸運を