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