因为“CALayer边界框包含NaN: [nan 0; nan 15.1]”而发生崩溃。

15

我遇到了以下崩溃问题:

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; 加上其它内容。请问有人知道是什么原因导致的吗?


你记录了尺寸和宽度变量吗?它们是什么数据类型? - Wain
@Wain - 它们都是CGFloat。不,我没有记录它们,这是用户的崩溃报告,所以不确定哪些值导致了崩溃。 - Ser Pounce
@CoDEFRo请查看Wain的回答中的评论。他提出了一些问题。 - Mani
@Mani - 谢谢你提醒我,我已经回复他了。 - Ser Pounce
6个回答

10
这意味着边界框的x位置和宽度都不是数字。这可能意味着负值,或者可能是除以零的问题。宽度的nan也可能是无法支持的非常大的宽度(尽管这应该会导致其他错误消息)。
这种情况通常是应用变换的结果,无论是用于创建边界的值还是应用于边界的视图/图层(因为这将修改应用的边界以确定帧)。
使用旋转变换时,请注意anchorPoint
在使用视图/图层变换时,在对frame进行更改之前将变换重置为identity

他已经尝试使用 fabsf(self.width)。那么如何传递负值呢? - Mani
哦,我错过了,你在代码的其他地方应用了视图/层的变换吗? - Wain
@Wain - 是的,我正在这样做:self.transform = CGAffineTransformMakeRotation(self.angle); 。这行代码出现在崩溃发生的那一行之后。 - Ser Pounce
7
负数不是 NaN(Not a Number)。除以零是最常见的问题。 - Sulthan

3
你可以在Xcode运行方案中设置CG_NUMERICS_SHOW_BACKTRACE环境变量,它会输出导致非数字值出现的堆栈跟踪。从那里开始,只需调查原因并加以防范即可。

2

在我的情况下,我忘记在项目中添加图片,在运行时我试图通过它们的名称使用这些图片,这就是为什么我会遇到这个错误。

现在,在项目中放置了这些图片后,问题已经解决。

希望这些提示对其他人有所帮助。


1

大家好!我的情况不完全一样,但很接近。我在尝试创建 UIimageView 时,在frame中得到了NaN值。 经过一些搜索,我发现我正在从空白处初始化frame - 我将frame绑定到UIimage的大小,但没有检查图像是否为空。这就是为什么在我的情况下会出现NaN值的原因。 在从它们创建frame之前,请确保传递所有值正确。


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的错误。因此,我手动为我的rect添加了xy

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

现在它正常工作了。


0
以下代码对我的情况有所帮助。
 super.init(frame: CGRect(x: 0, y: 0, width: 10, height: 10))

请确保您传递的CGRect和UIView子类的大小正常,并具有正确的值。不要忘记打开异常调试模式。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接