什么原因导致这个错误 “CALayer的立场包含NaN:”

我见过这种情况,只要我旋转一个有UITableView的屏幕就可以了。 我发现它发生在UIViewControllerwillRotatedidRotate方法调用之间我的同事也在其他地方看到了它,通常是围绕旋转。 它直到最近才开始发生,我们很难理解我们应该如何处理它(谷歌search没有以确切的forms显示错误信息)。 有没有其他人遇到这个知道该怎么办呢?

(决定把这个出来的意见,并把它作为一个答案,因为我认为这是一个很好的回答:)

哈! 我也有NaN计算(div0)。 关键的debugging帮助:有问题的消息是由NSLog()输出的,所以在NSLog()上设置一个断点,并观察当时的操作系统在做什么。 对我来说,这是myUISlider.value = NaN。

设置断点:

XCode 3.x

  • CMD-SHIFT-Y(debugging窗口)
  • 断点button。
  • “双击符号”
  • input“NSLog”(不含引号)。

XCode 4.x

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

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

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

我发现了这个问题。

当您重置tableview的框架时,它将调用委托方法tableView:heightForRowAtIndexPath:表中的每一行,以便在需要时重新计算其内容大小。 在这一点上,我们做了一些特殊的处理来恢复高度,由于我们的代码中有一些不好的假设,我们错误地归还了NaN因为被一个零误差(我们除以的variables被假定为不为零)。 确保我们在这里不除以零。

我花了一天的时间试图find导致相同问题的代码,并在Xcode中启用“打破例外”后的一分钟内解决了这个问题。 查看本教程以了解如何启用它。

我有这个问题,当我以为:

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的值转换为整数types,然后将其复制到特定的寄存器: %rax然后调用返回指令。

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

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

所以,如果你有错误的原型调用代码会期望值在错误的地方,你最终会真的返回一个垃圾值。

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

 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风格结构的所有值是否被正确初始化。