是什么导致这个错误? “CALayer位置包含NaN:[240 nan]”

时间:2010-06-11 18:15:19

标签: iphone core-animation calayer

每当我旋转屏幕上有UITableView时,我就会看到这种情况发生。我发现它发生在willRotate中的didRotateUIViewController方法调用之间。我的同事也在其他地方看到了它,通常是在旋转周围。它直到最近才开始发生,我们对如何应对它感到困惑(谷歌搜索不会以错误的形式显示错误消息)。有没有其他人遇到过这个知道如何应对的事情?

7 个答案:

答案 0 :(得分:35)

(决定从评论中取出这个并作为答案,因为我认为这是一个很好的答案:)

哈!我也有NaN计算(div0)。密钥调试辅助:有问题的消息由NSLog()输出,因此在NSLog()上设置断点并观察操作系统当时正在做什么。对我来说,这是myUISlider.value = NaN。

设置断点:

XCode 3.x

  • CMD-SHIFT-Y(调试窗口。)
  • 断点按钮。
  • “双击符号”
  • 输入“NSLog”(无引号。)

XCode 4.x

  • CMD-6(断点导航器。)
  • “+”添加断点(左下角。)
  • 选择ADD SYMBOLIC BREAKPOINT。
  • 符号:NSLog
  • 确认:完成。

XCode 5.x - 7.1(至少) (与4.x相同,断点导航器除外,现在是CMD-7。)

运行应用程序,在NSLog上查看它中断,检查堆栈跟踪。

答案 1 :(得分:26)

我发现了问题。

当您重置tableview的帧时,它会为表中的每一行调用委托方法tableView:heightForRowAtIndexPath:,以便在需要时重新计算其内容大小。那时,我们做了一些特殊的处理以返回高度,并且由于我们的代码中的一些错误的假设,我们错误地返回NaN由于零除错误(我们除以的变量假设永远不会零)。确保我们不将零除以此处修复它。

答案 2 :(得分:15)

我花了一天的时间试图找到导致同样问题的代码,并在Xcode中启用“break on exception”后几分钟内解决了。检查this tutorial以了解如何启用它。

答案 3 :(得分:12)

当我被认为:

时,我遇到了这个问题

tableView:heightForHeaderInSection:返回NSInteger,但会返回CGFloat ...

变化:

-(NSInteger)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

解决了我的问题。

编辑:

在某些时候我弄清楚计算机是如何工作在C级以下的,所以我想我会分享它...(我将使用x86_64中的寄存器名称,因为我最熟悉它们,ARM会略有不同但是类似)

int f(){
          float someFloat=5.0f;
          return someFloat;
       }

导致将someFloat的值转换为整数类型,然后将其复制到特定寄存器:%rax然后调用返回指令。

float f(){
          float someFloat=5.0f;
          return someFloat;
       }

导致将someFloat的值从当前位置复制到特定寄存器:%xmm0然后调用返回指令。

因此,如果你有错误的原型,调用代码会期望值在错误的位置,你最终会返回一个垃圾值。

答案 4 :(得分:2)

这个错误也让我花了很长时间 最后,我发现我的同事写了这样的话:

UIEdgeInsets a;
a.left = (...some calculation);
button.imageEdgeInsets = a;

我重写了这些代码并修复了问题:

UIEdgeInsets a;
a.left = (...some calculation);
a.top = 0;
a.bottom = 0;
a.right = 0;
button.imageEdgeInsets = a;

UIEdgeInsets的某些值未正确初始化,有时会变为NaN值,并使应用程序崩溃。
更一般地说,您应该检查C样式结构的所有值是否都已正确初始化。

答案 5 :(得分:0)

还有另一种方法可以重现这个问题:在一个太小的矩形上使用draw()

enter image description here

答案 6 :(得分:0)

您可以尝试此yourTableview?.bounces = false。它对我有用。