如何以编程方式更改或更新NSLayoutConstraint

时间:2015-06-03 12:24:09

标签: ios objective-c nslayoutconstraint

我已使用代码以编程方式实现了AutoLayout:

[self.view layoutIfNeeded];

这很有效,但每次ViewController收到通知时,它都会运行:

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;
    }

但我想根据连接的布尔变量设置listViewNavigation的宽度。

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];

但我不知道如何更新NSLayoutConstraint:

{{1}}

此ViewController收到通知

3 个答案:

答案 0 :(得分:17)

我认为你有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

答案 1 :(得分:13)

好的,我想出来了。

[self.view removeConstraint:self.constraintOld];
[self.view addConstraint:self.constraintNew];

[UIView animateWithDuration:time animations:^{
    [self.view layoutIfNeeded];
}];

答案 2 :(得分:1)

您不仅要在视图中添加约束,还要记住它们,这一点至关重要。

如果您只需要更改其常量,则最容易更改约束 - 常量是约束的唯一部分,可以在以后重复更改。要做到这一点,您需要自己存储约束。

否则您需要删除旧约束并添加新约束。由于您通常有多个约束,因此存储具有可能需要替换的约束集的数组,然后更新整个数组。您还可以使用activateConstraints和deactivateConstraints方法。