コードを使用してプログラムでAutoLayoutを実装しました:
- (void)addConstraintWithListNavigationViewController:(UIView *)listViewNavigation y:(CGFloat)y height:(CGFloat)height
{
//WIDTH_ListTableView = 0.4
//set x = 0;
NSLayoutConstraint *constraintToAnimate1 = [NSLayoutConstraint constraintWithItem:listViewNavigation
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeLeft
multiplier:0.00
constant:0];
[self.view addConstraint:constraintToAnimate1];
//set y = y;
NSLayoutConstraint *constraintToAnimate2 = [NSLayoutConstraint constraintWithItem:listViewNavigation
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeBottom
multiplier:0.00
constant:y];
[self.view addConstraint:constraintToAnimate2];
//set Width = self.view.frame.size.width*0.4
NSLayoutConstraint *constraintToAnimate3 = [NSLayoutConstraint constraintWithItem:listViewNavigation
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeWidth
multiplier:1-WIDTH_ListTableView
constant:0.0];
[self.view addConstraint:constraintToAnimate3];
//Set height = height
NSLayoutConstraint *constraintToAnimate4 = [NSLayoutConstraint constraintWithItem:listViewNavigation
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:0.00
constant:height];
[self.view addConstraint:constraintToAnimate4];
}
これは完璧に機能しますが、このViewControllerがNotificationを受け取るたびに実行されます:
[self.view layoutIfNeeded];
しかし、接続されたブール変数に従ってlistViewNavigationの幅を設定したいと思います。
if(connected){
listViewNavigation.view.frame.size.width = 0.4 * self.view.frame.size.width;
}
else{
listViewNavigation.view.frame.size.width = 0.6 * self.view.frame.size.width;
}
しかし、NSLayoutConstraintをどのように更新できるのかわかりません:
NSLayoutConstraint *constraintToAnimate3 = [NSLayoutConstraint constraintWithItem:PreView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeWidth
multiplier:1 - WIDTH_ListTableView
constant:0.0];
[self.view addConstraint:constraintToAnimate3];
このViewControllerがnotificationを受信したとき。
OK、わかりました。
[self.view removeConstraint:self.constraintOld];
[self.view addConstraint:self.constraintNew];
[UIView animateWithDuration:time animations:^{
[self.view layoutIfNeeded];
}];
2つの選択肢があると思います。
オプション1プロパティを保持
@property (strong,nonatomic)NSLayoutConstraint *constraintToAnimate3;
次に、このプロパティを使用して
self.constraintToAnimate3 = [NSLayoutConstraint constraintWithItem:PreView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeWidth
multiplier:1
constant:-1 * 0.4 * self.view.frame.size.width];
[self.view addConstraint:self.constraintToAnimate3];
変更したいとき
if(connected){
self.constraintToAnimate3.constant = -1 *0.6 * self.view.frame.size.width;
}
else{
self.constraintToAnimate3.constant = -1 *0.4 * self.view.frame.size.width;
}
[UIView animateWithDuration:yourduration animations:^{
[self.view layoutIfNeeded];
}];
オプション2 constraintToAnimate3の識別子を設定します
constraintToAnimate3.identifier = @"1234"
次に、制約を取得するために検索します
NSLayoutConstraint * constraint3 = nil;
NSArray * constraints = self.view.constraints;
for (NSLayoutConstraint * constraint in constraints) {
if ([constraint.identifier isEqualToString:@"1234"]) {
constraint3 = constraint;
break;
}
}
次に、Option1に示すように定数を変更します
更新:投稿するコードで定数を使用する場合
PreView.frame.size.with = self.view.size.width * multiplier + constant
ビューに制約を追加するだけでなく、それらを覚えておくことが重要です。
定数の変更のみが必要な場合は、制約を変更するのが最も簡単です。定数は、後で繰り返し変更できる制約の唯一の部分です。そのためには、制約を独自に保存する必要があります。
それ以外の場合は、古い制約を削除して新しい制約を追加する必要があります。通常、複数の制約があるため、置換が必要な可能性のある制約のセットで配列を保存し、配列全体を更新します。 activateConstraintsメソッドとdeactivateConstraintsメソッドを使用することもできます。