单个 IB 约束的简单编程修改不更新

Posted

技术标签:

【中文标题】单个 IB 约束的简单编程修改不更新【英文标题】:simple programmatic modification of a single IB constraint not updating 【发布时间】:2017-01-19 14:24:12 【问题描述】:

编辑:看来我需要更改乘数而不是常数。

我正在尝试在某个事件发生后以编程方式更改 viewDidLoad 之外的按钮的宽度(如果这很重要)。

我已将 IB 中的按钮宽度设置为等于视图宽度。

我已经为按钮宽度约束创建了一个 IB 插座:

@IBOutlet weak var imageButtonWidth: NSLayoutConstraint!

那我试过了:

 imageButtonWidth.constant = 0.49
    view.setNeedsLayout()

 imageButtonWidth.constant = 0.49
    view.layoutIfNeeded()

imageButtonWidth.constant = 0.49
    self.view.updateConstraints()

我在 imageButtonWidth.constant = 0.49 处设置了一个断点,它使应用程序崩溃,所以我知道它正在“运行”它只是没有正确激活。

我用过

imageButtonWidth.constant = 0.49
    self.view.updateConstraints()

在另一个应用程序上的 viewdidload 中没有问题,但如果调用在 viewdidload 之外,它似乎不会被确认。

任何建议将不胜感激!

【问题讨论】:

0.49 的宽度常数会给你一个小于 1 磅宽的按钮。你确定这是正确的值吗?您是否在控制台中看到任何约束错误? 没有没有错误。它略小于视图的一半,其中要查看的按钮的宽度完全相等将是常数 1。感谢您的响应! 你把常数误认为是乘数,我想。您无法更改乘数。 是的,你是对的,但必须有办法改变它。 你必须禁用约束,创建一个新的,然后激活它。 【参考方案1】:

正确的做法是使用

 self.view.layoutIfNeeded()

要更新约束,但您可能连接了错误的插座,因为约束的值似乎很低。

【讨论】:

啊哇,我刚刚回顾了我的 IB,我实际上需要更改乘数,而不是常数。但似乎乘数是只读的。 很酷,所以如果你设法解决了你的问题,你应该回答你自己的问题,这样其他人也可以看到解决方案。如果不是...您更改约束的方式是使用常量并将其分配一个新值,然后运行 ​​self.view.layoutIfNeeded()

以上是关于单个 IB 约束的简单编程修改不更新的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式从超级视图中删除视图后更新约束/框架(自动布局)

在IB中或以编程方式重用不同场景的视图

自动布局比例间距

iOS:以编程方式更改从 Interface Builder 设置的约束

以编程方式测试视图约束(在单元测试中)

以编程方式添加的约束不起作用