Search code examples
objective-cmkmapviewmkannotationview

Cannot do MKAnnotationView animate drop with custom image


I have successfully changed MKAnnotationView to use my custom image with the following code snippet. However, my problem is that once I enable default pin animation using

   annotationView.animatesDrop = YES; 

The custom image is gone and default red pin is used. Is there any way to fix this? Thanks

 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(MyAnnotation  *)annotation
 {
    if  ([annotation isKindOfClass:[MKUserLocation class]])
    return nil;
// try to dequeue an existing pin view first
static NSString* identifier = @"AnnotationIdentifier";

MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (annotationView == nil) {
    annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
    annotationView.enabled = YES;
    annotationView.canShowCallout = YES;
    //!!!!!!!annotationView.animatesDrop = YES;!!!!!!!!!!
} else {
    annotationView.annotation = annotation;
}

  annotationView.image = [UIImage imageNamed:@"bla.png"];
 return annotationView;
}

Solution

  • Try smth like this:

    - (void)loadView {
        self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
        self.view.backgroundColor = [UIColor grayColor];
        [self.view setClipsToBounds:YES];
    
        MKMapView *mapView = [[MKMapView alloc] initWithFrame:CGRectMake(10, 10, self.view.frame.size.width - 20, self.view.frame.size.height - 20)];
        mapView.delegate = self;
        [mapView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
        mapView.mapType = MKMapTypeStandard;
        [self.view addSubview:mapView];
    }
    
    #pragma mark - MKMapView Delegate Implementation
    
    - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {   
        for (MKAnnotationView *pin in views) {
            //UIButton *detailsButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            //[detailsButton addTarget:self action:@selector(detailsButtonAct:) forControlEvents:UIControlEventTouchUpInside];
    
            pin.canShowCallout = YES;
            //pin.rightCalloutAccessoryView = detailsButton;
            CGRect endFrame = pin.frame;
            pin.frame = CGRectOffset(pin.frame, 0, -230);
    
            [UIView beginAnimations:nil context:nil];
            [UIView setAnimationDuration:0.45f];
            [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    
            pin.frame = endFrame;
    
            [UIView commitAnimations];
        }
    }
    - (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation {
        static NSString *AnnotationViewID = @"annotationViewID";
        MKAnnotationView *annotationView = (MKAnnotationView *)[map dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
    
        if (annotationView == nil)
            annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID] autorelease];
    
        annotationView.image = [UIImage imageNamed:@"map_pin.png"];
        annotationView.annotation = annotation;
    
        [annotationView addObserver:self forKeyPath:@"selected" options:NSKeyValueObservingOptionNew context:@"pinSelected"];
        [annotationView setEnabled:YES];
    
        return annotationView;
    }