2017-09-25 69 views
0

我被一个奇怪的自动布局错误卡住了。更新约束后按钮位置不正确自动布局

我有两个按钮(确认和删除)并排,在相同的视图中,每个都取自己的超视图的50%的宽度,在某些情况下(当test = true时),我想隐藏确认按钮所以删除按钮会占用屏幕的所有宽度。

这里是我的自动布局:

enter image description here

确认按钮:

enter image description here

删除按钮:

enter image description here

镨比例宽度是超视图的50%(1:2)。现在,这里是我的电话,在viewWillAppear发生:

if test { 
    self.confirmButtonWidthConstraint.constant = 0 
    self.deleteButtonWidthConstraint.constant = (self.deleteButton.superview?.frame.width)! 
} 

但是,这样做在此之后的结果:

enter image description here

和检查UI调试后,我可以看到,奇怪的是,这现在删除按钮的宽度为... 480,起始x为-160。所以我不知道这里发生了什么。请帮忙!

enter image description here

+0

如果您的约束使用Autolayout确定的数据(例如视图的宽度),则应根据确切用例在'viewDidLayoutSubviews()'或'viewWillLayoutSubviews()'中调用相关代码。 –

+0

感谢您的回答。我尝试过,但仍得到相同的结果。 – Someday

回答

3

我可以提出一个不同的策略吗?

将按钮设置为堆叠视图(UIStackView),并将按钮设置为平等填充。

然后你可以设置你的按钮消失与button.isHidden = true。堆栈视图将优雅地处理你的布局。

+0

完美地工作!谢谢 – Someday

2

你已经按比例设置的宽度,但正在更新的约束constant财产。这将需要导致您期望的结果,因为比例宽度将简单地将constant值添加到乘数结果中。

相反,您应该设置您的约束的multiplier属性。例如:

if test { 
    self.confirmButtonWidthConstraint.multiplier = 0.0 
    self.deleteButtonWidthConstraint.multiplier = 1.0 
} 
+0

噢,我现在看到我的错误是什么。我最终使用了Jack Daw的解决方案,因为它对我来说似乎更“自然”,但它绝对有意义。再次感谢 ! – Someday

+0

是的,他的解决方案是首选。真高兴你做到了。快乐的编码! – beyowulf