关闭视图时发生自动布局内部错误

Posted

技术标签:

【中文标题】关闭视图时发生自动布局内部错误【英文标题】:Auto layout internal error happening when a view is dismissed 【发布时间】:2015-12-22 06:09:16 【问题描述】:

当我忽略一些我有一些限制的观点时,我遇到了一个有趣的错误。

自动布局内部错误。找不到传出行头 传入头部 AppName.ViewName:0x7fc072ed8ef0.Widthid:6805 期间 系数接近零的变量的优化,这应该 永远不会发生。

我在添加这些约束的几个视图上遇到了这个错误。此错误消息的一种变体如下:

自动布局内部错误。 在优化过程中找不到传入头 id: 6630 的传出行头 系数接近于零的变量,这绝不应该发生。

有没有人遇到过与此错误类似的问题?关于如何调试它的任何提示?

【问题讨论】:

这是由于不满足约束而发生的。您必须根据前导、轨迹高度和宽度来修复它。有时它在 4 侧环绕中完成,有时它通过 3 侧环绕约束来满足。 您能详细说明一下吗? “根据引线高度和宽度修复它”。你的意思是有一个左右和顶部的约束? hai 请看下面的链接,它会让你明白一点,谢谢! ***.com/questions/28965610/… 这确实有帮助!事实证明,如果你使用的乘数不是 1.0,你就不能使用像 1.2 或 0.8 这样的平面值,你需要使用 0.79999 或 1.199999,否则你会在某些设备上崩溃。非常感谢!考虑将此发布到答案中,我会接受。 【参考方案1】:

我仍然不能 100% 确定为什么会这样,但关键是,如果您将整数作为等宽或等高的约束值,则约束系数接近于零。

例如,您不能使用像 1.2 或 0.8 这样的平面值,您需要使用 0.79999 或 1.199999,否则您会在某些设备上崩溃。

我更新了我的所有约束以使用 0.7999 之类的数字并且它起作用了。

想要疯狂的证据吗?把它放在操场上:

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 “假”

太疯狂了,但这恰恰说明了错误发生的原因。希望这会有所帮助。

【讨论】:

不是疯了,电脑说用二进制做所有的数学运算,它永远不会不准确。看看:en.wikipedia.org/wiki/Machine_epsilon

以上是关于关闭视图时发生自动布局内部错误的主要内容,如果未能解决你的问题,请参考以下文章

iOS 中的自动布局

当兄弟姐妹随自动布局发生变化时,视图不会重绘

当我推送一个新的视图控制器时,自动布局高度发生变化

如何使用自动调整大小和自动布局并更改其默认行为? [关闭]

创建基于自动布局的指标视图

使用自动布局调整子视图的大小