Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Uncaught exception: CALayer position contains NaN when doing animation

I am getting this error in my application when I run on an iPad:

Uncaught exception: CALayer position contains NaN

The same code works fine on an 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;
                        }];
                    }
                }];
            }
        }];
    }
}

I get to know that, the frame which is assigning is contains NaN value, I checked this with CGRectEmpty function and setting that frame to CGRectZero but it wont work.

I got this working code from here, 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
like image 908
Hemang Avatar asked Apr 08 '14 11:04

Hemang


1 Answers

OMG! I didn't know I could make such "silly" mistake.

Yes, the sentence in question The same code works fine on an iPhone. I was getting error CALayer position contains NaN because in my custom - (AnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id ) annotation method, where I am calculating

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

annotationView.image was blank because I forgot to add the pin image in iPad project. It was there in iPhone code. So it was divided by Zero (0) and cause an error.

I put break point, and print with NSLog get to know that,

1.0 - (diffFromBottom * 1.0)/annotationView.image.size.height the value of this was printed, -inf. This was causing the app crash.

Basically, this error occurs if you'll perform a division by infinity or zero so whenever you got such error first look in code, where you performing the division operation.

like image 141
Hemang Avatar answered Nov 17 '22 18:11

Hemang