web-dev-qa-db-ja.com

NSLayoutConstraint定数が設定後に更新されない

対応するUIViewファイルを持つxibサブクラスがあります。私のxibには、アニメーション化しようとしているNSLayoutConstraintプロパティがあります。 animateInメソッドがあります。問題は、animateInメソッドのみが機能することです。定数を再度更新しようとすると、前の値のままになります。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *horizontalConstraint;

ボタンを押した後に定数を更新しようとしています。しかし、定数は設定後に更新されないようです。 -500に設定した後でも0を記録します。 layoutIfNeededを呼び出していますが、何も起こりません。

// this works
- (void) animateIn { 
    [UIView animateWithDuration:1.0 delay:2.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        self.alpha = 1.0;
    } completion:^(BOOL finished) {

        [UIView animateWithDuration:1.0 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            self.horizontalConstraint.constant = 0;
            [self layoutIfNeeded];
        } completion:^(BOOL finished) {
        }];
    }];
}

// this does not work
- (IBAction)resume:(id)sender {
        self.horizontalConstraint.constant = -500;
        [self layoutIfNeeded];

        NSLog(@"%f",self.horizontalConstraint.constant); // this always stays 0
    }

[〜#〜] update [〜#〜]

NSLayoutConstraintを2回使用したい場合は(null)のようです。それが更新されない理由を説明します。それを参照するにはどうすればよいですか?

18
Ramin Afshar

NSLayoutConstraintが存在する対応するUIView(control)setNeedsUpdateConstraintsメソッドを呼び出して、制約を更新する必要があります。

UIButtonの例

self.buttonConstraint.constant = 55;
[self.btnTest setNeedsUpdateConstraints];

あなたの場合

[self setNeedsUpdateConstraints];
48
Yogesh Suthar

この制約はどこかで無効化されていませんか?制約の「アクティブ」プロパティをfalseに設定すると、ビュー階層で制約が削除されます。参照も持っていない場合、制約オブジェクトはメモリから削除されます。

私はあなたと同じ問題を抱えており、「弱点」を削除したため、制約は強力なプロパティになりました。その結果、非アクティブ化時にnilに設定されず(View Controllerには常に強力なポインタがあるため)、再アクティブ化して定数を再設定できます。

// NB: don't create these contraints outlets as "weak" if you intend to de-activate them, otherwise they would be set to nil when deactivated!
@IBOutlet private var captionViewHeightConstraint: NSLayoutConstraint!
10
Frédéric Adda

コードで最初に制約定数を設定すると定数が設定されるが、layoutIfNeeded()を呼び出した後、次のような問題が発生しました。

myConstraint.constant = newValue;
[view layoutIfNeeded]

定数は元の値に戻ります!デバッガーで値の変更を確認できました。

ストーリーボードで、定数にバリエーションを設定したことが原因であることがわかりました。例えば:

enter image description here

バリエーションを削除しても、layoutIfNeeded呼び出しで制約定数の値は元の値に戻りませんでした。

8
CLK

制約の変更が終了したら、以下を呼び出します。

[self setNeedsUpdateConstraints];
5
Bogdan Somlea