11

私はかつて持っていたこのビューを持っていますautoresizingMask = UIViewAutoresizingFlexibleHeight

ステータス バーがその高さをアニメートすると (電話を切るときなど)、ビューの高さがアニメートされて増加します。

しかし、自動レイアウトでは、この autoresizingMask を制約に置き換えています。

UIView *orangeView = [[UIView alloc] initWithFrame:CGRectZero];
orangeView.translatesAutoresizingMaskIntoConstraints = NO;
orangeView.backgroundColor = [UIColor orangeColor];

[self.view addSubview:orangeView];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[orangeView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(orangeView)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(40)-[orangeView]-(190)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(orangeView)]];

しかし今、私のレイアウトの変更はステータスバーでアニメーション化されず、アニメーションなしで変更されただけです.

これで、制約ベースのレイアウトを使用する場合、アニメーション ブロックで -layoutIfNeeded を呼び出す必要があることがわかりました。しかし、ここでアニメーション ブロックを作成するのは私ではありません。変更をアニメーション化する方法はありますか?

私が開始していないこのアニメーション ブロック中に実行されるコード内の場所を見つけなければならないということですか? が起動されたときにコントローラーで [self.view layoutIfNeeded] を設定しようとしましたUIApplicationWillChangeStatusBarFrameNotificationが、機能しません。

4

1 に答える 1

2

メソッドに制約を必ず追加してくださいupdateConstraints

ドキュメントの内容は次のとおりです。

制約自体を設定するカスタム ビューは、このメソッドをオーバーライドして行う必要があります。カスタム ビューが、その制約の 1 つを無効にする変更がビューに加えられたことを認識した場合、その制約をすぐに削除してから、setNeedsUpdateConstraints を呼び出して、制約を更新する必要があることを通知する必要があります。

于 2013-03-22T17:59:16.123 に答える