2014-04-08 8 views
6

ich diesen Fehler in meiner Anwendung bin immer, wenn ich auf einem iPad laufen:abgefangene Ausnahme: CALayer Position enthält NaN, wenn Animation tun

abgefangene Ausnahme: CALayer Position NaN enthält

Der gleiche Code funktioniert gut auf einem 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; 
         }]; 
        } 
       }]; 
      } 
     }]; 
    } 
} 

ich kennenlernen, die der Rahmen Zuweisen ist NaN Wert enthält, überprüfte ich dies mit CGRectEmpty Funktion und Einstellung, den Rahmen zu CGRectZero aber es wird nicht funktionieren.

Ich habe diese Arbeit Code von hier, 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

Fügen Sie einen Ausnahmehaltepunkt hinzu. Gehen Sie zum "Breakpoint Navigator", klicken Sie auf das "+" links unten und wählen Sie "Exception Breakpoint hinzufügen". Führen Sie die App aus, um den Haltepunkt zu erhalten. Wenn Sie den Ausnahmeblockpunkt angeklickt haben, klicken Sie mehrmals auf Debuggen und Sie erhalten eine Backtrace und weitere Fehlerinformationen. Post thatund eine exakte Kopie von Xcode/Debugger Nachrichten. – zaph

+0

Ich habe Verhalten dieser Art mit sehr kleinen Zeitintervallen gesehen - oder sehr Animationsinkremente - ich vermute letztlich als Ergebnis, dass ein Wert so klein ist, dass er sich auf Null normalisiert und dann in der Division verwendet wird. – marko

Antwort

6

OMG! Ich wusste nicht, dass ich einen solchen "dummen" Fehler machen könnte.

Ja, der Satz in Frage Der gleiche Code funktioniert gut auf einem iPhone. ich Fehler immer CALayer position contains NaN weil in meiner benutzerdefinierten - (AnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id) annotation Methode, wo ich

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

annotationView.image leer war am Berechnung, weil ich den Stift Bild in iPad Projekt hinzuzufügen vergessen. Es war dort im iPhone Code. Es wurde also durch Null (0) geteilt und verursacht einen Fehler.

Ich habe Punkt zu brechen, und drucken mit NSLog, das wissen bekommen,

1.0 - (diffFromBottom * 1.0)/annotationView.image.size.height der Wert dieser gedruckt wurde, -inf. Dies verursachte den Absturz der App.

Grundsätzlich tritt dieser Fehler auf, wenn Sie eine Division durch Unendlich oder Null durchführen, also wenn Sie einen solchen Fehler haben, schauen Sie zuerst in Code, wo Sie die Division durchführen.

+0

form mein Fall "Nan" kam wegen Teilung Null Wert "Nan" Wert kam so. Vielleicht hilft dir das. – Virus

Verwandte Themen