Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MKAnnotationView custom button image

I am trying to use a custom image on my MKAnnotationView when I use the following code I get no image on my annotation. I have checked in debug to ensure the image is being properly loaded into the UIImage.

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {


    MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"String"];
    if(!annotationView) {

        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"String"];
        UIButton *directionButton = [UIButton buttonWithType:UIButtonTypeCustom];
        UIImage *directionIcon = [UIImage imageNamed:@"IconDirections"];

        [directionButton setImage:directionIcon forState:UIControlStateNormal];

        annotationView.rightCalloutAccessoryView = directionButton;
    }

    annotationView.enabled = YES;
    annotationView.canShowCallout = YES;

    return annotationView;
}
like image 817
Clip Avatar asked Mar 26 '26 13:03

Clip


1 Answers

There are two main issues:

  1. The frame of the custom callout button is not set making it essentially invisible.
  2. An MKAnnotationView is being created but its image property (the image of the annotation itself -- not the callout button's) is not set. This makes the whole annotation invisible.

For issue 1, set the button's frame to some appropriate value. For example:

UIImage *directionIcon = [UIImage imageNamed:@"IconDirections"];
directionButton.frame = 
    CGRectMake(0, 0, directionIcon.size.width, directionIcon.size.height);

For issue 2, set the annotation view's image (or create an MKPinAnnotationView instead):

annotationView.image = [UIImage imageNamed:@"SomeIcon"];


Additionally, you should handle view re-use correctly by updating the annotation property.
Complete example:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{    
    MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"String"];
    if(!annotationView) {

        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"String"];

        annotationView.image = [UIImage imageNamed:@"SomeIcon"];

        UIButton *directionButton = [UIButton buttonWithType:UIButtonTypeCustom];
        UIImage *directionIcon = [UIImage imageNamed:@"IconDirections"];
        directionButton.frame = 
            CGRectMake(0, 0, directionIcon.size.width, directionIcon.size.height);

        [directionButton setImage:directionIcon forState:UIControlStateNormal];

        annotationView.rightCalloutAccessoryView = directionButton;
        annotationView.enabled = YES;
        annotationView.canShowCallout = YES;
    }
    else {
        //update annotation to current if re-using a view
        annotationView.annotation = annotation;
    }    

    return annotationView;
}

Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!