ビューコントローラーがあり、ビューの制約をupdateViewConstraintsで作成および設定します。私はそのメソッドにブレークポイントがあり、呼び出されることはありません。
なぜ呼び出されないのでしょうか。フレームワークはいつビューコントローラーでこのメソッドを呼び出す必要がありますか?
updateViewConstraints
はviewWillLayoutSubviews
によって呼び出されます(途中でビューのlayoutSubviews
メソッドを介して)。名前が示すように、これは、ViewControllerがレイアウトを更新する必要があるときに呼び出されます。
updateViewConstraints
がneverであることがわかった場合は、必要に応じて、ビューコントローラーのメソッドsuper
を呼び出していることを確認してください。
また、あなたがcreatingupdateViewConstraints
内の制約であるかのように聞こえますか?それもあなたの問題の原因かもしれません。制約を作成するのではなく、そのメソッドで更新する必要があります(layoutSubviews
でビューを配置するのと同じ方法ですが、インスタンス化しないでください)。
ViewControllerを使用していて、システムにupdateViewConstraints
を呼び出させたい場合は、これを呼び出す必要があります。
[self.view setNeedsUpdateConstraints];
UIView
は+ (BOOL)requiresConstraintBasedLayout
を実装し、YES
を返す必要があります。その場合、制約を設定するために最初にupdateViewConstraints
が呼び出されます。
単なる推測であり、100%確実ではありません。
ビューコントローラのルートビューが自動レイアウトを必要としない場合、updateViewConstraintsは呼び出されません。したがって、少なくとも1つの制約をルートビュー(loadviewまたはviewDidLoadのどこか)に追加するか、または設定する必要があります。
self.view.translatesAutoresizingMaskIntoConstraints = NO;
これにより、ブレークポイントがトリガーされます。
Apple documentaionが言うように、setNeedsUpdateConstraints
を呼び出す必要があります。
変更をスケジュールするには、ビューでsetNeedsUpdateConstraintsを呼び出します。次に、システムは、レイアウトが発生する前にupdateViewConstraintsの実装を呼び出します。 ( アップルリファレンス )
制約が追加されたかどうかを示すフラグを追加すると、updateViewConstraints
に制約を追加できます。参照 私の要点
@implementation ViewController {
bool _constraintsAdded;
}
- (void)updateViewConstraints {
if (!_constraintsAdded) {
_constraintsAdded = true;
// TODO: add constraints to self.view's subviews
}
NSLog(@"update constraint.");
// TODO: update constraints needed
[super updateViewConstraints]; // must be called finally.
}
@end