3sl
3sl

Reputation: 295

Custom image for MKAnnotation

I have created an annotation which I'm adding to an MKMapView. How would I go about having a custom image instead of the standard red pin?

@interface AddressAnnotation : NSObject<MKAnnotation> {
    CLLocationCoordinate2D coordinate;
    NSString *title;
    NSString *subtitle;
    MKPinAnnotationColor pinColor;
}
@property (nonatomic,retain) NSString *title;
@property (nonatomic,retain) NSString *subtitle;
@property (nonatomic, assign) MKPinAnnotationColor pinColor;
@end

Upvotes: 10

Views: 12918

Answers (3)

Oleh Veheria
Oleh Veheria

Reputation: 412

To set custom image instead of standart MKPinAnnotationView the only way to do that is to use MKAnnotationView with function - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation. Here's the example:

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

     if ([annotation isKindOfClass:[MKUserLocation class]]) {
                return  nil;
     }

     static NSString *identifier = @"Annotation";

     MKAnnotationView *aView = [mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

     if (!aView) {
          aView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
          aView.image = [UIImage imageNamed:@"Untitled1.png"];
          aView.canShowCallout = YES;
          aView.draggable = YES;
     } else {
          aView.annotation = annotation;
     }

     return pin;
}

For the aView.image value You can set Your own image. And also look into MKAnnotationView class reference to handle better with it.

Upvotes: 0

Jano
Jano

Reputation: 63667

MKMapView gets its pin views from its delegate method mapView:viewForAnnotation: So you have to:

  1. Set your view controller as the map's delegate.
  2. Implement mapView:viewForAnnotation: in your controller.

Set your controller as delegate

@interface MapViewController : UIViewController <MKMapViewDelegate>

Mark the interface with the delegate protocol. This let's you set the controller as MKMapView's delegate in Interface Builder (IB). Open the .xib file containing your map, right click the MKMapView, and drag the delegate outlet to your controller.
If you prefer to use code instead IB, add self.yourMapView.delegate=self; in the controller's viewDidLoad method. The result will be the same.

Implement mapView:viewForAnnotation:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    // this part is boilerplate code used to create or reuse a pin annotation
    static NSString *viewId = @"MKPinAnnotationView";
    MKPinAnnotationView *annotationView = (MKPinAnnotationView*) 
        [self.mapView dequeueReusableAnnotationViewWithIdentifier:viewId];
    if (annotationView == nil) {
        annotationView = [[[MKPinAnnotationView alloc] 
            initWithAnnotation:annotation reuseIdentifier:viewId] autorelease];
    }
    // set your custom image
    annotationView.image = [UIImage imageNamed:@"emoji-ghost.png"];
    return annotationView;
}

Upvotes: 18

Ole Begemann
Ole Begemann

Reputation: 135540

Override the mapView:viewForAnnotation: delegate method. If the annotation param points to one of your custom annotations, return a custom view that looks to your liking.

Upvotes: 1

Related Questions