如何在代码中编辑约束条件

11

我有一个网页,它开始时的宽度限制是100。

当用户点击按钮时,我想将其更改为200。

我尝试过以下方法:

NSLayoutConstraint *constrain = [NSLayoutConstraint
                                 constraintWithItem:self.webPage
                                 attribute:NSLayoutAttributeWidth
                                 relatedBy:NSLayoutRelationEqual
                                 toItem:self.webPage
                                 attribute:NSLayoutAttributeWidth
                                 multiplier:1
                                 constant:100];




[self.webPage addConstraint:constrain];

但是这会抛出以下异常:

"无法同时满足约束条件。"

有什么想法吗?

2个回答

27

你有两个选项。

  1. 获取原约束的引用,并将其 constant 部分更改为200。
  2. 获取原约束的引用并从视图中移除它,然后添加新约束。

我会选择第一种选项。要获取引用,请在您的 viewController 中为该约束添加一个 @property,并在创建它时进行赋值。

如果您在 xib 或 storyboard 中创建约束,请像连接 UILabel 时所做的那样,将约束与 IBOutlet 连接到您的代码中。

然后,您可以轻松调整约束的 constant 部分。


此外,您的约束应该更类似于以下内容:

NSLayoutConstraint *constraint = [NSLayoutConstraint
                                 constraintWithItem:self.webPage
                                 attribute:NSLayoutAttributeWidth
                                 relatedBy:NSLayoutRelationEqual
                                 toItem:nil
                                 attribute:NSLayoutAttributeNotAnAttribute
                                 multiplier:1
                                 constant:100];

1
好的,你能展示一下如何访问原始的约束条件吗(这是在IB中完成的)? - oopsi
4
将约束条件连接到IBOutlet,就像连接UILabel或其他控件一样。 - Matthias Bauch
你有什么想法可以让限制条件随着动画的变化而改变吗? - oopsi
2
@oopsi,如果你想要动画效果,修改animateWithDuration:animations: block中的常量值,并调用[superview layoutIfNeeded],其中“superview”是约束添加到的任何视图。 - rdelmar
太好了!我不知道我们可以这样做。 - PeYoTlL

9

如果您想设置宽度,但没有toItem,请进行设置。

_myConstrain = [NSLayoutConstraint
                             constraintWithItem:self.webPage
                             attribute:NSLayoutAttributeWidth
                             relatedBy:NSLayoutRelationEqual
                             toItem:nil
                             attribute:NSLayoutAttributeNotAnAttribute
                             multiplier:1
                             constant:100];

// add to superview! not to self.webPage 
[self.view addConstraint:_myConstrain];

当您以后想要更改它时:
_myConstrain.constant = 200.0f; 
[self.view layoutIfNeeded]; // you may be able to call this on self.webPage

出色的方法。 - Mantas Laurinavičius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接