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

Ios 致命异常:CALayerInvalidGeometry CALayer边界包含NaN:[-14 NaN;375 0],ios,core-animation,calayer,Ios,Core Animation,Calayer,与我的应用程序集成的Crashlytics报告了一个崩溃,它说: CALayerInvalidGeometry:CALayer边界包含NaN:[-14 NaN;375 0] 实际上,我既无法再现崩溃,也无法识别可能发生崩溃的控制器类或方法的任何相关信息。 我已经仔细检查了我的应用程序中包含的所有数学问题,还针对StackOverFlow检查了几个相关问题,但不可能找到任何解决方案。 非常感谢您的帮助。这些问题非常难以发现,但不幸的是,这看起来确实像是被零除掉的问题。首先,用零除不会得到NaN,而

与我的应用程序集成的Crashlytics报告了一个崩溃,它说:

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

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

这些问题非常难以发现,但不幸的是,这看起来确实像是被零除掉的问题。首先,用零除不会得到
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)
}

这将用
0.0
替换您的
NaN
,并很可能修复崩溃。但仍无法判断结果如何。您也可以这样做,在其中添加一些
if
语句,并使用断点尝试自己随机复制问题。通过这种方式,您可能会找到更多关于正在发生的事情的信息,但您需要能够重现问题。

指出您所做的一切尝试。在没有任何相关信息的情况下,即使有人提供了解决方案,他们如何知道您是否已经尝试过(如您所述)。我重新验证了可能没有任何帧值被指定为负值,或者存在被零除类型的问题。@NikolayShevchenko否决票没有问题,但我只想告诉大家crashlytics报告了一个崩溃,并且没有ViewController或Method,也没有任何特定的行表示崩溃发生的位置,所以不可能写下代码。