対応する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)のようです。それが更新されない理由を説明します。それを参照するにはどうすればよいですか?
NSLayoutConstraintが存在する対応するUIView(control)
のsetNeedsUpdateConstraints
メソッドを呼び出して、制約を更新する必要があります。
UIButtonの例
self.buttonConstraint.constant = 55;
[self.btnTest setNeedsUpdateConstraints];
あなたの場合
[self setNeedsUpdateConstraints];
この制約はどこかで無効化されていませんか?制約の「アクティブ」プロパティを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!
制約の変更が終了したら、以下を呼び出します。
[self setNeedsUpdateConstraints];