2014-04-08 11 views
6

otrzymuję ten błąd w mojej aplikacji, gdy biegnę na iPada:Uncaught wyjątek: pozycja CALayer zawiera NaN gdy robi animację

Uncaught wyjątek: pozycja CALayer zawiera NaN

Ten sam kod działa dobrze na iPhonie.

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

mi poznać, że rama która jest przypisanie zawiera NaN wartość, sprawdziłem to z CGRectEmpty funkcji i ustawienie tej ramki do CGRectZero ale to przyzwyczajenie praca.

mam ten kod roboczy stąd https://stackoverflow.com/a/7045916/1603234

ślad/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

Dodaj przerwania wyjątku. Przejdź do "Breakpoint Navigator", kliknij "+" w lewym dolnym rogu, wybierz "Add Exception Breakpoint". Uruchom aplikację, aby uzyskać punkt przerwania. Po osiągnięciu punktu przerwania wyjątku kliknij kilka razy debugowanie, a otrzymasz ślad i więcej informacji o błędzie. Opublikuj tęi dokładną kopię wiadomości Xcode/Debugger. – zaph

+0

widziałem zachowanie tego rodzaju w bardzo małych odstępach czasu - lub przyrostach samych animacji - Podejrzewam, że ostatecznie w wyniku wartość jest tak mała, że ​​normalizuje się do zera, a następnie wykorzystywane w podziale. – marko

Odpowiedz

6

OMG! Nie wiedziałem, że mogę popełnić taki "głupiutki" błąd.

Tak zdanie w kwestii Ten sam kod działa poprawnie na iPhone. byłem coraz błąd CALayer position contains NaN bo w moim sposobie zwyczaj - (AnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id) annotation, gdzie jestem obliczania

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

annotationView.image był pusty, bo zapomniałem dodać szpilka zdjęcie w projekcie iPada. To było w kodzie iPhone'a. Został podzielony przez zero (0) i spowodował błąd.

umieścić punkt złamania, i wydrukować z NSLog poznać, że

1.0 - (diffFromBottom * 1.0)/annotationView.image.size.height wartość ta została drukowanej, -inf. To spowodowało awarię aplikacji.

Zasadniczo, ten błąd występuje, jeśli będziesz wykonać dzielenie przez nieskończoność lub zero więc kiedy masz takie błędzie najpierw szukać w kodzie, gdzie wykonywania operacji dzielenia.

+0

tworzą mój przypadek „nan” przyszedł z powodu dzieląc wartość zero „nan” wartość wracał tak. Może to ci pomoże. – Virus

Powiązane problemy