致命异常:CALayerInvalidGeometry CALayer界限包含NaN:[ - 14 nan; 375 0]

时间:2018-06-05 11:21:43

标签: ios core-animation calayer

与我的应用程序集成的Crashlytics报告了一次崩溃:

  

CALayerInvalidGeometry:CALayer界限包含NaN:[ - 14 nan; 375 0]

我实际上既不能重现崩溃,也无法识别有关可能发生崩溃的控制器类或方法的任何相关信息。 我已经仔细检查了我的应用程序中包含的所有数学,并且还通过StackOverFlow查看了几个相关问题,但无法找到任何解决方案。 任何帮助非常感谢。

1 个答案:

答案 0 :(得分:0)

这些非常难以发现,但不幸的是,这看起来像是一些逐个划分的问题。首先,除以零将不会给您NaN,而是inf-inf。将NaN除以零的唯一方法是将0.0除以0.0。还有其他方式可以NaN使用acos(2.0),因为cos位于区间[-1,1]。

但最重要的是,NaN的所有操作都会导致NaN,这意味着以下内容:

let a: CGFloat = 0.0
let b: CGFloat = 0.0
let c: CGFloat = a/b

let frame = CGRect(x: 14.0, y: 30.0*c, width: 375.0, height: 0.0)
print(frame)

输出(14.0, nan, 375.0, 0.0)。因此,即使您在30.0*c中看不到可能除零,您仍然可以在参数c中将除以零。

我知道遇到一个问题,因为这个问题非常痛苦。您可以通过实施顶级方法来克服它:

func CGRect(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat) -> CoreGraphics.CGRect {
    return CoreGraphics.CGRect(x: x.isNaN ? 0.0 : x, y: y.isNaN ? 0.0 : y, width: width.isNaN ? 0.0 : width, height: height.isNaN ? 0.0 : height)
}

这会将NaN替换为0.0,并且最有可能修复崩溃。仍然没有办法说出结果会是什么。你也可以这样做,并在那里添加一些if语句,并使用断点尝试自己随机重现问题。通过这种方式,您可以找到有关正在发生的事情的更多信息,但您需要能够重现该问题。