2014-04-08 17 views
6

sto ottenendo questo errore nel mio applicazione quando ho eseguito su un iPad:eccezione Uncaught: posizione CALayer contiene NaN quando si fa animazione

Uncaught eccezione: posizione CALayer contiene NaN

Lo stesso codice funziona bene su un iPhone.

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views 
{ 
    AnnotationView *aV; 

    for (aV in views) { 
     // Don't pin drop if annotation is user location 
     if ([aV.annotation isKindOfClass:[MKUserLocation class]]) { 
      continue; 
     } 

     // Check if current annotation is inside visible map rect, else go to next one 
     MKMapPoint point = MKMapPointForCoordinate(aV.annotation.coordinate); 
     if (!MKMapRectContainsPoint(mapViewResult.visibleMapRect, point)) { 
      continue; 
     } 

     CGRect endFrame = aV.frame; 

     // Move annotation out of view 
     // I checked here, CGRectEmpty returns true here 

     aV.frame = CGRectMake(aV.frame.origin.x, aV.frame.origin.y - self.view.frame.size.height, aV.frame.size.width, aV.frame.size.height); 

     // Animate drop 
     [UIView animateWithDuration:0.5 delay:0.04*[views indexOfObject:aV] options: UIViewAnimationOptionCurveLinear animations:^{ 

      aV.frame = endFrame; 

      // Animate squash 
     }completion:^(BOOL finished){ 
      if (finished) { 
       [UIView animateWithDuration:0.05 animations:^{ 
        aV.transform = CGAffineTransformMakeScale(1.0, 0.8); 

       }completion:^(BOOL finished){ 
        if (finished) { 
         [UIView animateWithDuration:0.1 animations:^{ 
          aV.transform = CGAffineTransformIdentity; 
         }]; 
        } 
       }]; 
      } 
     }]; 
    } 
} 

ottengo sapere che, il telaio che si assegna è contiene NaN valore, ho controllato questo con CGRectEmpty funzione e l'impostazione che telaio per CGRectZero ma non funzionerà.

ho ricevuto questo codice di lavoro da qui, https://stackoverflow.com/a/7045916/1603234

Backtrace/Debug Log

*** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [594.947 nan]' 
*** First throw call stack: 
(
    0 CoreFoundation      0x048551e4 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x034ad8e5 objc_exception_throw + 44 
    2 CoreFoundation      0x04854fbb +[NSException raise:format:] + 139 
    3 QuartzCore       0x01a1be1a _ZN2CA5Layer12set_positionERKNS_4Vec2IdEEb + 190 
    4 QuartzCore       0x01a1bfd9 -[CALayer setPosition:] + 68 
    5 QuartzCore       0x01a1c6df -[CALayer setFrame:] + 799 
    6 UIKit        0x01fbbb4d -[UIView(Geometry) setFrame:] + 302 
    7 MyAppName       0x0026b025 -[ResultMapViewController mapView:didAddAnnotationViews:] + 2133 
    8 MapKit        0x01e0449b -[MKMapView annotationManager:didAddAnnotationRepresentations:] + 272 
    9 MapKit        0x01e3b53c -[MKAnnotationManager updateVisibleAnnotations] + 2052 
    10 Foundation       0x02ed6de7 __NSFireTimer + 97 
    11 CoreFoundation      0x04813ac6 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22 
    12 CoreFoundation      0x048134ad __CFRunLoopDoTimer + 1181 
    13 CoreFoundation      0x047fb538 __CFRunLoopRun + 1816 
    14 CoreFoundation      0x047fa9d3 CFRunLoopRunSpecific + 467 
    15 CoreFoundation      0x047fa7eb CFRunLoopRunInMode + 123 
    16 GraphicsServices     0x03ccd5ee GSEventRunModal + 192 
    17 GraphicsServices     0x03ccd42b GSEventRun + 104 
    18 UIKit        0x01f60f9b UIApplicationMain + 1225 
    19 MyAppName       0x0001ba3d main + 141 
    20 MyAppName       0x000027e5 start + 53 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+2

Aggiungere un punto di interruzione eccezione. Vai a "Breakpoint Navigator", fai clic su "+" in basso a sinistra, seleziona "Aggiungi breakpoint di eccezione". Esegui l'app per ottenere il punto di interruzione. Quando si preme il punto di interruzione di eccezione, fare clic su debug continua un paio di volte e si otterrà un backtrace e ulteriori informazioni sull'errore. Pubblica una copia esatta dei messaggi Xcode/Debugger. – zaph

+0

Ho visto un comportamento di questo tipo con intervalli di tempo molto piccoli - o incrementi di animazione molto grandi - ho il sospetto che alla fine il risultato sia un valore così piccolo da normalizzarsi a zero e quindi essere usato in divisione. – marko

risposta

6

OMG! Non sapevo di poter commettere un errore così "sciocco".

Sì, la frase in questione Lo stesso codice funziona bene su un iPhone. mi stavo errore CALayer position contains NaN perché nel mio metodo personalizzato - (AnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id) annotation, dove sto calcolando

annotationView.layer.anchorPoint = CGPointMake(0.5, 1.0 - (diffFromBottom * 1.0)/annotationView.image.size.height); 

annotationView.image era vuota perché ho dimenticato di aggiungere l'immagine perno del progetto iPad. Era lì nel codice di iPhone. Quindi è stato diviso per Zero (0) e causa un errore.

ho messo punto di rottura, e stampare con NSLog arrivare a sapere che,

1.0 - (diffFromBottom * 1.0)/annotationView.image.size.height il valore di questo è stato stampato, -inf. Ciò causava l'arresto anomalo dell'app.

Fondamentalmente, questo errore si verifica se si eseguirà una divisione per infinito o zero, quindi ogni volta che si ottiene tale errore, esaminare prima il codice, dove si sta eseguendo l'operazione di divisione.

+0

forma il mio caso "nan" è venuto a causa della divisione del valore zero "nan" valore stava arrivando così. Potrebbe essere questo aiuterà per voi. – Virus

Problemi correlati