由于“CALayer bounds包含NaN:[nan 0; nan 15.1]”而发生崩溃

时间:2014-01-06 11:54:18

标签: ios iphone cocoa-touch

我遇到了以下崩溃:

CALayerInvalidGeometry CALayerInvalidGeometry
CALayer bounds contains NaN: [nan 0; nan 15.1]

在此代码的最后一行:

CGRect bounds = self.bounds;
bounds.size = CGSizeMake(fabsf(self.width), self.height);
self.bounds = bounds;

其中self.width源自平移手势识别器:

CGPoint panGestureRecognizerTranslationPoint = [panGestureRecognizer translationInView:panGestureRecognizer.view.superview.superview];

CGPoint rotatedPanGestureRecognizerTranslationPoint = CGPointApplyAffineTransform(panGestureRecognizerTranslationPoint, CGAffineTransformMakeRotation(-self.angle));
self.width += rotatedPanGestureRecognizerTranslationPoint.x;

我遇到此崩溃时的一个共性是在错误消息中,它总是[nan 0;接下来是什么。任何人都知道可能导致这种情况的原因吗?

6 个答案:

答案 0 :(得分:6)

  

[nan 0;南15.1]

这意味着边界的x位置和width都不是数字。这可能意味着负值,或者可能是零分类型问题。宽度的nan也可能是一个非常大的宽度,无法支持(尽管这会导致其他错误消息)。

这种事情通常是应用变换的结果,可以是用于创建bounds的值,也可以是应用边界的视图/图层(因为这将修改应用的{ {1}}确定bounds)。

使用旋转变换时,请注意frame

使用视图/图层变换时,请在对anchorPoint进行更改之前将变换重置为identity

答案 1 :(得分:1)

专家!我的情况不是这样,而是接近。当我尝试创建UIimageView时,我在frame rect中得到了Nan值。 经过一些搜索,我发现我正在从零开始初始化帧 - 我将帧绑定到UIimage大小,但没有检查图像是否为零。这就是为什么Nan值出现在我的案例中的原因。 在从它们创建帧之前检查是否正确传递了所有值。

答案 2 :(得分:1)

在我的情况下,我忘了在我的项目和运行时添加图像我试图按照他们的名字使用这些图像,这就是我收到此错误的原因。

现在,在将图像放入项目中后,它就解决了。

希望这些技巧能够帮助他人。

答案 3 :(得分:1)

您可以在Xcode运行方案中设置CG_NUMERICS_SHOW_BACKTRACE环境变量,它将转储导致非数字值发生的堆栈跟踪。

从那里,只是调查它为什么会发生并防范它。

答案 4 :(得分:0)

我知道你已经找到了问题,但对于那些面临同样问题的人来说:

我遇到了同样的问题。我的代码是:

CGRect rect;
rect.size.width = _mImage.size.width;
rect.size.height = _mImage.size.height;

[_imageView setFrame:rect];

当我第一次和第二次打开视图时,一切正常。但在第三次尝试类似[_imageView setFrame:rect]时我有CALayer bounds contains NaN所以我为x手动添加了yrect

rect.origin.x = 0;
rect.origin.y = 0;

所以现在工作正常。

答案 5 :(得分:0)

以下代码对我的情况有所帮助。

 super.init(frame: CGRect(x: 0, y: 0, width: 10, height: 10))

请确保传递的CGRect和其他UIView大小的Child可以正常工作并具有正确的值。并且不要忘记打开Exception调试模式。 enter image description here