2011-02-01 18 views
20

He visto mucho en esto, pero parece que solo puedo obtener webView y tablas relacionadas con este problema. El mío es totalmente diferente, parece que con la misma excepción de bloqueo:CALayerInvalidGeometry ', razón:' CALayer bounds contiene NaN: [0 0; nan nan] crash in view

CALayerInvalidGeometry ', razón:' CALayer bounds contiene NaN: [0 0; nan nan]

Básicamente lo que tengo aquí es una vista que se desvanece y escalas de imágenes. Recientemente decidí cambiar mi código usando CGAffineTransformScale en una animación UIView en lugar de escalar las cosas cada vez que un temporizador marca. Esto usa mucho menos poder de procesamiento.

Pero no importa en qué orden tengo las imágenes, siempre se cuelga después de la 19ª. No parece ser un problema con la matriz de coordenadas de posicionamiento a la que se refiere, porque tiene solo 6 pulgadas de longitud y se curva después de que alcanza su longitud. Entonces, por algún motivo, desde que implementé este código de animación, me da esa falla. Alguien sabe por qué?

Aquí es la parte que he cambiado desde que comenzó a chocar:

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

EDITAR:

Así es como me dieron el código anterior para trabajar sin el problema de estrellarse usando 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;} 
+4

NaN ocurre normalmente cuando se divide por cero. Revisa y revisa todas tus matemáticas. –

+0

También he oído esto, pero ¿en qué parte de este código estoy dividiendo entre 0? – VagueExplanation

+0

¿Puedes publicar el rastro de la pila? – Max

Respuesta

11

De acuerdo con la pila de rastrear el problema es que aquí

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

intenta establecer el imageView_A.transform a la identidad. Otra solución (y creo que mejor) sería utilizar UIScrollView para escalar (también se podría hacer animado).

Editar: probar este

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]; 
+0

En mi caso, el establecimiento de imageView_A.transform a CGAffineTransformIdentity no son equivalentes. UIScrollView no tiene mucho sentido para mí, especialmente si quiero que varias vistas de imágenes se transformen de forma independiente. ¿Por qué debería el marco para imageView_A ser un problema de todos modos? – VagueExplanation

+0

porque el bloqueo se produce durante la configuración de la imageView_A.frame – Max

+0

Bien, gracias. Parece que ha detenido el estrellarse. Tendré que encontrar un trabajo para modificarlo para que se comporte como debería. – VagueExplanation