解决 CALayerInvalidGeometry 问题

Posted 芒果味ly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决 CALayerInvalidGeometry 问题相关的知识,希望对你有一定的参考价值。

今天遇到了很多 calyer 设置坐标的崩溃,原因如下:

Fatal Exception: CALayerInvalidGeometry
CALayer position contains NaN: [nan 8]

坐标竟然是 NaN (非数字)!这还得了,马上排查!!!
下面是具体崩溃信息:

Thread : Fatal Exception: CALayerInvalidGeometry
0  CoreFoundation                 0x23a2a5f7 __exceptionPreprocess
1  libobjc.A.dylib                0x3129cc77 objc_exception_throw
2  CoreFoundation                 0x23a2a53d -[NSException initWithCoder:]
3  QuartzCore                     0x268f01cf CA::Layer::set_position(CA::Vec2<double> const&, bool)
4  QuartzCore                     0x268f00d3 -[CALayer setPosition:]
5  QuartzCore                     0x268f0065 -[CALayer setFrame:]
6  UIKit                          0x26ec8fe3 -[UIView(Geometry) setFrame:]
7  SOHUVideo                      0xa937d -[DiskStatusView updateDiskStatus] (DiskStatusView.m:65)
...

立马定位到 DiskStatusView 类的 updateDiskStatus 方法,发现他的一个子 view 的宽度在某种情况下会出现非数字的情况!知道问题所在就好改了,判断下就 OK 啦!

说来也怪,宽度是非数字,为何异常却是:CALayer position contains NaN: [nan 8] 呢?!这个 8 是哪里来的,y 坐标本来设置的是 0 啊,这点真不理解呢 …

NaN : 非数字,一般都是 0 作除数的结果!

简单的说:rect 里面不能包含非数字,否则就会报 CALayerInvalidGeometry 异常!解决办法就是仔细检查 rect 的4个值!

以上是关于解决 CALayerInvalidGeometry 问题的主要内容,如果未能解决你的问题,请参考以下文章

随机“CALayerInvalidGeometry 原因:CALayer 位置包含 NaN”异常

由于未捕获的异常“CALayerInvalidGeometry”而终止应用程序,原因:“CALayer bounds contains NaN: [0 nan; 280 524]'

CALayerInvalidGeometry',原因:'CALayer bounds contains NaN: [0 0; nan nan] 在视图中崩溃

随机“CALayerInvalidGeometry原因:CALayer位置包含NaN”异常

小胖说事35-----Terminating app due to uncaught exception &#39;CALayerInvalidGeometry&#39;, reaso

UIScrollView CALayer 位置包含 NaN