自動レイアウトチェーンは基本的に3つの異なるプロセスで構成されることを知っています。
- 制約の更新
- レイアウトビュー(ここでフレームの計算を取得します)
- 表示
何は、私には全く明らかではないとの内側の差です-setNeedsLayout
と-setNeedsUpdateConstraints
。Apple Docsから:
ビューのサブビューのレイアウトを調整する場合は、アプリケーションのメインスレッドでこのメソッドを呼び出します。このメソッドはリクエストを記録し、すぐに戻ります。このメソッドは即時の更新を強制せず、代わりに次の更新サイクルを待機するため、これらのビューを更新する前に、このメソッドを使用して複数のビューのレイアウトを無効にすることができます。この動作により、すべてのレイアウト更新を1つの更新サイクルに統合できます。これは通常、パフォーマンスの点で優れています。
カスタムビューのプロパティが制約に影響を与える方法で変更された場合、このメソッドを呼び出して、将来のある時点で制約を更新する必要があることを示すことができます。次に、システムはupdateConstraintsを通常のレイアウトパスの一部として呼び出します。制約が必要になる直前に一度に更新することで、レイアウトパス間でビューに複数の変更が加えられたときに、不必要に制約を再計算する必要がなくなります。
制約を変更した後でビューをアニメーション化し、通常は変更をアニメーション化する場合は、たとえば次のようにします。
[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[self.modifConstrView setNeedsUpdateConstraints];
[self.modifConstrView layoutIfNeeded];
} completion:NULL];
すべてを使用するのでは-setNeedsLayout
なく-setNeedsUpdateConstraints
期待どおりに機能する場合は、を使用して変更-layoutIfNeeded
する-updateConstraintsIfNeeded
とアニメーションが発生しないことがわかりました。
私は自分の結論を出そうとしました:
-updateConstraintsIfNeeded
制約を更新するだけで、レイアウトを強制的に実行しないため、元のフレームは保持されます-setNeedsLayout
-updateContraints
メソッドも呼び出す
では、一方を他方の代わりに使用してもよいのはいつですか?レイアウトメソッドについては、制約が変更されたビューまたは親ビューで呼び出す必要がありますか?