web-dev-qa-db-ja.com

フレームワークによってビューコントローラーでupdateViewConstraintsが呼び出されるのはいつですか?

ビューコントローラーがあり、ビューの制約をupdateViewConstraintsで作成および設定します。私はそのメソッドにブレークポイントがあり、呼び出されることはありません。

なぜ呼び出されないのでしょうか。フレームワークはいつビューコントローラーでこのメソッドを呼び出す必要がありますか?

20
topwik

updateViewConstraintsviewWillLayoutSubviewsによって呼び出されます(途中でビューのlayoutSubviewsメソッドを介して)。名前が示すように、これは、ViewControllerがレイアウトを更新する必要があるときに呼び出されます。

updateViewConstraintsneverであることがわかった場合は、必要に応じて、ビューコントローラーのメソッドsuperを呼び出していることを確認してください。

また、あなたがcreatingupdateViewConstraints内の制約であるかのように聞こえますか?それもあなたの問題の原因かもしれません。制約を作成するのではなく、そのメソッドで更新する必要があります(layoutSubviewsでビューを配置するのと同じ方法ですが、インスタンス化しないでください)。

16
lxt

ViewControllerを使用していて、システムにupdateViewConstraintsを呼び出させたい場合は、これを呼び出す必要があります。

[self.view setNeedsUpdateConstraints];
14
onmyway133

UIView+ (BOOL)requiresConstraintBasedLayoutを実装し、YESを返す必要があります。その場合、制約を設定するために最初にupdateViewConstraintsが呼び出されます。

13
highmaintenance

単なる推測であり、100%確実ではありません。

ビューコントローラのルートビューが自動レイアウトを必要としない場合、updateViewConstraintsは呼び出されません。したがって、少なくとも1つの制約をルートビュー(loadviewまたはviewDidLoadのどこか)に追加するか、または設定する必要があります。

self.view.translatesAutoresizingMaskIntoConstraints = NO;

これにより、ブレークポイントがトリガーされます。

6
Klaas

Apple documentaionが言うように、setNeedsUpdateConstraintsを呼び出す必要があります。

変更をスケジュールするには、ビューでsetNeedsUpdateConstraintsを呼び出します。次に、システムは、レイアウトが発生する前にupdateViewConstraintsの実装を呼び出します。 ( アップルリファレンス

0
Doug

制約が追加されたかどうかを示すフラグを追加すると、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
0
DawnSong