当视图被解除时,自动布局出现内部错误。

6
我在去除一些已经设置了约束的视图时,遇到了一个有趣的错误。
自动布局内部错误。在优化具有接近零系数的变量时,无法找到传出的行头 AppName.ViewName:0x7fc072ed8ef0.Width{id: 6805},这应该永远不会发生。
我在添加这些约束到多个视图时都遇到了这个问题。这个错误信息的一个变种如下:
自动布局内部错误。在优化具有接近零系数的变量时,无法找到传出的行头 {id: 6630},这应该永远不会发生。
有人遇到过类似的问题吗?有没有关于如何调试的提示?

这是由于未满足的约束条件造成的。您需要按照主导、尾部高度和宽度进行修复。有时它可以在四个侧面完成包装,另一些情况下则通过三个侧面的约束条件得到满足。 - S. Karthik
你能详细说明一下吗?“根据引导轨迹的高度和宽度进行修复”是什么意思?你的意思是要有左、右和顶部的约束吗? - Unome
请查看以下链接,它可以帮助您更清楚地理解。谢谢! https://dev59.com/e4jca4cB1Zd3GeqPzJoG - S. Karthik
那真的有帮助!原来如果你使用不是1.0的倍数值,你不能使用像1.2或者0.8这样的平坦值,你需要使用0.79999或者1.199999,否则在某些设备上会导致崩溃。非常感谢!考虑将这个答案发布出来,我会接受的。 - Unome
1个回答

3

我仍然不完全确定为什么会出现这种情况,但关键在于如果您在等宽或等高的约束值使用整数,则会得到接近零的系数。

例如,您不能使用1.2或0.8等平坦的值,而需要使用0.79999或1.199999等数字,否则会在某些设备上崩溃。

我将所有的约束更新为使用0.7999等数字,这样就行了。

想要证明无常?可以在playground中尝试一下:

let a: Double = 0.8
let b: Double = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1
print(a == b)

游乐场的结果读起来令人惊讶:
0.8 0.79999999 "false"
这很疯狂,但这正是为什么出现错误的原因。希望这可以帮助到您。

不要惊讶,计算机说把所有的数学运算都用二进制来做,就永远不会出现不准确的情况。请参考:https://en.wikipedia.org/wiki/Machine_epsilon - EricLeaf

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