【问题标题】:Crash occurring because "CALayer bounds contains NaN: [nan 0; nan 15.1]"由于“CALayer bounds contains NaN: [nan 0; nan 15.1]”而发生崩溃
【发布时间】:2014-01-06 11:54:18
【问题描述】:

我遇到了以下崩溃:

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 - 他们都是 CGFloat。不,我没有记录它们,这是来自用户的崩溃报告,所以不确定是什么值导致了崩溃。
  • @CoDEFRo 见 cmets 关于 Wain 的回答。他问了什么。
  • @Mani - 感谢您的提醒,我回复了他。

标签: ios iphone cocoa-touch


【解决方案1】:

[南 0;南 15.1]

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

这种事情通常是应用转换的结果,无论是用于创建bounds 的值还是应用边界的视图/层(因为这将修改应用的bounds确定frame)。

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

使用视图/图层变换时,请先将变换重置为 identity,然后再更改 frame

【讨论】:

  • 他已经尝试过fabsf(self.width)。那么它是如何传递负值的呢?
  • 嗯,错过了,您是否在代码中的其他地方对视图/图层应用了转换?
  • @Wain - 是的,我在做:self.transform = CGAffineTransformMakeRotation(self.angle); .该行代码出现在发生崩溃的行之后。
  • 负值不​​是 NaN。除以零是最常见的问题。
【解决方案2】:

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

从那里,只需调查它发生的原因并防范它。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      伙计们!我的情况不是这样,但很接近。当我尝试制作 UIimageView 时,我在框架矩形中有 Nan 值。 经过一些搜索后,我发现我正在从无到有初始化框架 - 我将框架绑定到 UIimage 大小,但没有检查图像是否不为零。所以这就是为什么 Nan 价值观出现在我的案例中。 在从它们创建框架之前检查您是否正确传递了所有值。

      【讨论】:

        【解决方案5】:

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

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

        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;
        

        所以它现在工作正常。

        【讨论】:

          【解决方案6】:

          下面的代码对我有帮助。

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

          请确保您传递的 CGRect 和其他 UIView 大小的 Child 正常工作并具有正确的值。并且不要忘记打开您的异常调试模式。

          【讨论】:

            猜你喜欢
            • 2011-06-19
            • 1970-01-01
            • 2017-05-11
            • 2013-03-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多