1. ホーム
  2. ios

[解決済み] NSLayoutConstraintのmultiplierプロパティを変更することはできますか?

2022-04-24 14:44:54

質問

1つのスーパービューに2つのビューを作成し、ビュー間に制約を追加しました。

_indicatorConstrainWidth = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeWidth multiplier:1.0f constant:0.0f];
[_indicatorConstrainWidth setPriority:UILayoutPriorityDefaultLow];
_indicatorConstrainHeight = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f];
[_indicatorConstrainHeight setPriority:UILayoutPriorityDefaultLow];
[self addConstraint:_indicatorConstrainWidth];
[self addConstraint:_indicatorConstrainHeight];

さて、アニメーションで乗数プロパティを変更したいのですが、乗数プロパティを変更する方法がわかりません。(ヘッダーファイル NSLayoutConstraint.h の private property に _coefficient がありましたが、private です。)

マルチプラープロパティを変更するにはどうすればよいですか?

私の回避策は、古い制約を削除し、新しい制約に異なる値を追加することです。 multipler .

解決方法は?

適用する必要のある乗数が2つしかない場合、以下のようになります。 iOS8 その後、両方の制約を追加して、常にどちらをアクティブにするかを決定できます。

NSLayoutConstraint *standardConstraint, *zoomedConstraint;

// ...
// switch between constraints
standardConstraint.active = NO; // this line should always be the first line. because you have to deactivate one before activating the other one. or they will conflict.
zoomedConstraint.active = YES;
[self.view layoutIfNeeded]; // or using [UIView animate ...]

Swift 5.0バージョン

var standardConstraint: NSLayoutConstraint!
var zoomedConstraint: NSLayoutConstraint!

// ...

// switch between constraints
standardConstraint.isActive = false // this line should always be the first line. because you have to deactivate one before activating the other one. or they will conflict.
zoomedConstraint.isActive = true
self.view.layoutIfNeeded() // or using UIView.animate