CALayerInvalidGeometry',原因:'CALayer bounds contains NaN: [0 0; nan nan] 在视图中崩溃

Posted

技术标签:

【中文标题】CALayerInvalidGeometry\',原因:\'CALayer bounds contains NaN: [0 0; nan nan] 在视图中崩溃【英文标题】:CALayerInvalidGeometry', reason: 'CALayer bounds contains NaN: [0 0; nan nan] crash in viewCALayerInvalidGeometry',原因:'CALayer bounds contains NaN: [0 0; nan nan] 在视图中崩溃 【发布时间】:2011-06-19 13:44:05 【问题描述】:

我对此进行了很多研究,但我似乎只能获得与此问题相关的 webView 和表格。我的完全不同,似乎有相同的崩溃异常:

CALayerInvalidGeometry', reason: 'CALayer bounds contains NaN: [0 0;楠楠]

基本上我这里有一个淡化和缩放图像的视图。我最近决定在 UIView 动画中使用 CGAffineTransformScale 更改我的代码,而不是每次计时器滴答时都将其放大一个档次。这使用更少的处理能力。

但是无论我按什么顺序排列图片,它总是在第 19 张之后崩溃。它所引用的定位坐标数组似乎没有问题,因为它的长度只有 6,并且在达到其长度后循环。因此,由于某种原因,现在我已经实现了这个动画代码,它给了我崩溃。有谁知道为什么?

这是我在崩溃后更改的部分:

-(void) onTimer

if(scaleTimer_A==5)

    imageView_A.image = [UIImage imageNamed:[attractList_A objectAtIndex:imageIndex_A]];

    imageView_A.frame = CGRectMake(300, 200, 3.86, 3.86);

    imageView_A.center = CGPointMake(attractLocs_x_A[attractLocs_A_index], attractLocs_y_A[attractLocs_A_index]);



    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:2];
    imageView_A.alpha = 1;
    imageView_A.transform = CGAffineTransformScale(imageView_A.transform, 100, 100);
    [UIView commitAnimations]; 


if(scaleTimer_A==10)

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:.75];
    imageView_A.alpha = 0;
    imageView_A.transform = CGAffineTransformScale(imageView_A.transform, 1.2, 1.2);
    [UIView commitAnimations]; 

    scaleTimer_A=0;

    imageIndex_A+=1;

    if(imageIndex_A==imageIndex_A_size)
        imageIndex_A=0;
    

    attractLocs_A_index+=1;

    if(attractLocs_A_index==attractLocs_A_SIZE)
        NSLog(@"Back to zero A");
        attractLocs_A_index=0;
    
    NSLog(@"Image A =%@", [attractList_A objectAtIndex:imageIndex_A]);


scaleTimer_A+=1;

编辑

以下是我如何使用 CGAffineTransformIdentity 使上面的代码正常工作而不会出现崩溃问题。

-(void) onTimer

if(scaleTimer_A==5)

    imageView_A.image = [UIImage imageNamed:[attractList_A objectAtIndex:imageIndex_A]];

    imageView_A.transform = CGAffineTransformIdentity;

    imageView_A.center = CGPointMake(attractLocs_x_A[attractLocs_A_index], attractLocs_y_A[attractLocs_A_index]);



    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:2];
    imageView_A.alpha = 1;
    imageView_A.transform = CGAffineTransformScale(CGAffineTransformIdentity, 100, 100);
    [UIView commitAnimations]; 


if(scaleTimer_A==10)

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:.75];
    imageView_A.alpha = 0;
    imageView_A.transform = CGAffineTransformScale(CGAffineTransformIdentity, 120, 120);
    [UIView commitAnimations]; 

    scaleTimer_A=0;

    imageIndex_A+=1;

    if(imageIndex_A==imageIndex_A_size)
        imageIndex_A=0;
    

    attractLocs_A_index+=1;

    if(attractLocs_A_index==attractLocs_A_SIZE)
        NSLog(@"Back to zero A");
        attractLocs_A_index=0;
    
    NSLog(@"Image A =%@", [attractList_A objectAtIndex:imageIndex_A]);


scaleTimer_A+=1;

【问题讨论】:

NaN 通常在除以零时发生。仔细检查你所有的数学。 我也听说过,但是这段代码我在哪里除以 0? 你能发布堆栈跟踪吗? 废话.. 抱歉,这完全是错误的日志.. 等等 ** 由于未捕获的异常“CALayerInvalidGeometry”而终止应用程序,原因:“CALayer bounds contains NaN: [0 0; nan nan]' *** 第一次抛出调用堆栈:( 0 CoreFoundation 0x009ddbe9 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x015a15c2 objc_exception_throw + 47 2 CoreFoundation 0x00996628 +[NSException raise:format:arguments:] + 136 3 CoreFoundation 0x0099659a +[ NSException raise:format:] + 58 4 QuartzCore 0x0079a3ee _ZL16CALayerSetBoundsP7CALayerRKN2CA4RectEb + 227 【参考方案1】:

根据堆栈跟踪,问题出在此处

imageView_A.frame = CGRectMake(300, 200, 3.86, 3.86);

尝试将 imageView_A.transform 设置为标识。另一种解决方案(我认为更好)是使用 UIScrollView 进行缩放(也可以制作动画)。

编辑:试试这个

    imageView_A.image = [UIImage imageNamed:[attractList_A objectAtIndex:imageIndex_A]];

    imageView_A.frame = CGRectMake(300, 200, 3.86, 3.86);

    imageView_A.center = CGPointMake(attractLocs_x_A[attractLocs_A_index], attractLocs_y_A[attractLocs_A_index]);



    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:2];
    imageView_A.alpha = 1;
    imageView_A.frame = CGRectMake(300, 200, 386.0f, 386.0f);
    [UIView commitAnimations]; 

【讨论】:

在我的例子中,将 imageView_A.transform 设置为 CGAffineTransformIdentity 是不等价的。 UIScrollView 对我来说没有多大意义,尤其是当我想要多个图像视图独立转换时。为什么 imageView_A 的框架仍然是个问题? 因为崩溃是在 imageView_A.frame 的设置过程中 好的,谢谢。它似乎已经停止了崩溃。我只需要想出一个变通方法来调整它,让它表现得像它应该的那样。 @Max 如何将 CGAffineTransformIdentity 与我拥有的代码一起使用并使其行为方式相同?我已经尝试了很多东西。我被难住了。 好吧,试着像这样缩放视图 imageView_A.transform = CGAffineTransformScale(CGAffineTransformIdentity, 100, 100);但我不确定它是否会按预期工作,因为我实际上不知道你想要达到什么最终结果。

以上是关于CALayerInvalidGeometry',原因:'CALayer bounds contains NaN: [0 0; nan nan] 在视图中崩溃的主要内容,如果未能解决你的问题,请参考以下文章

CALayerInvalidGeometry',原因:'CALayer bounds contains NaN: [0 0; nan nan] 在视图中崩溃

解决 CALayerInvalidGeometry 问题

解决 CALayerInvalidGeometry 问题

随机“CALayerInvalidGeometry原因:CALayer位置包含NaN”异常

小胖说事35-----Terminating app due to uncaught exception 'CALayerInvalidGeometry', reaso

UIScrollView CALayer 位置包含 NaN