【问题标题】:Fatal Exception: CALayerInvalidGeometry CALayer bounds contains NaN: [-14 nan; 375 0]致命异常:CALayerInvalidGeometry CALayer 边界包含 NaN:[-14 nan; 375 0]
【发布时间】:2018-06-05 11:21:42
【问题描述】:

与我的应用程序集成的 Crashlytics 报告了一个崩溃,上面写着:

CALayerInvalidGeometry:CALayer bounds contains NaN: [-14 nan; 375 0]

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

【问题讨论】:

  • 指出您尝试过的所有内容。没有任何相关信息,即使有人提供了解决方案,他们怎么知道您是否还没有尝试过(如您所述)。
  • 我重新验证了可能没有任何帧值被分配负值,或者存在除以零类型问题。
  • @NikolayShevchenko 否决票没有问题,但只是想告诉 crashlytics 报告了崩溃,并且没有 ViewController 或方法或任何象征崩溃发生的特定行,所以不可能放下代码。

标签: ios core-animation calayer


【解决方案1】:

这些是极难发现的,但不幸的是,这看起来确实像一些类似被零除的问题。首先除以零不会给你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 语句并使用断点尝试自己随机重现问题。这样您可能会找到有关正在发生的事情的更多信息,但您需要能够重现该问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2019-10-06
    相关资源
    最近更新 更多