代码之家  ›  专栏  ›  技术社区  ›  Kevlar

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

  •  44
  • Kevlar  · 技术社区  · 14 年前

    每当我旋转一个屏幕 UITableView 关于它。我发现它发生在 willRotate didRotate 方法调用 UIViewController 我的同事也在其他地方看到过,通常是轮班。它直到最近才开始发生,我们一直在琢磨我们应该如何处理它(谷歌搜索不会以它的确切形式显示错误信息)。有没有其他人遇到过这种情况,知道该怎么办?

    7 回复  |  直到 6 年前
        1
  •  35
  •   Olie    9 年前

    (决定把这句话从评论中删去,作为答案,因为我认为这是一个令人讨厌的好答案。)

    哈!我也有一个NaN计算(div0)。密钥调试帮助:有问题的消息是由nslog()输出的,所以在nslog()上设置一个断点,并观察操作系统当时在做什么。对于我来说,它是myuislider.value=nan。

    设置断点:

    XCODE 3 X

    • cmd-shift-y(调试窗口。)
    • 断点按钮。
    • “双击指定符号”
    • 输入“nslog”(无引号)。

    XCODE 4 X

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

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

    运行应用程序,观察它在nslog上的中断,检查堆栈跟踪。

        2
  •  25
  •   pablasso Jordan    13 年前

    我发现了问题。

    当您重置 tableview ,它调用委托方法 tableView:heightForRowAtIndexPath: 为表中的每一行重新计算内容大小(如果需要)。在这一点上,我们做了一些特殊的处理来返回高度,并且由于代码中的一些错误假设,我们错误地返回了 NaN 由于被零除错误(我们被除的变量被假定为永远不为零)。确保我们不被零除,这里修正它。

        3
  •  15
  •   azernitsky    12 年前

    我花了一天时间来寻找导致同样问题的代码,并在Xcode中启用“异常中断”后的几分钟内解决了它。检查 this tutorial 看看如何启用它。

        4
  •  12
  •   Grady Player    11 年前

    当我被假定为:

    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;
           }
    

    结果复制了 一些漂浮物 从其当前位置到特定寄存器: %xmm0 然后调用返回指令。

    因此,如果您有错误的原型,调用代码将期望值位于错误的位置,那么您最终将真正返回一个垃圾值。

        5
  •  2
  •   Z.L.Chen    10 年前

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

    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;
    

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

        6
  •  0
  •   Tim    7 年前

    有另一种方法来重现问题:在过小的rect上使用 insertby(dx:dy:)

    enter image description here

        7
  •  0
  •   kalpesh Jordan    6 年前

    你可以试试这个 yourTableview?.bounces = false . 它对我有用。