Пользовательское изображение для MKAnnotation

Я создал аннотацию, которую я добавляю в MKMapView. Как я могу использовать пользовательское изображение вместо стандартного красного вывода?

@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

Ответ 1

MKMapView получает свои представления пэдов из своего метода-делегата mapView: viewForAnnotation: Итак, вы должны:

  • Установите контроллер вида в качестве делегата карты.
  • Реализация mapView: viewForAnnotation: в вашем контроллере.

Установите контроллер в качестве делегата

@interface MapViewController : UIViewController <MKMapViewDelegate>

Отметьте интерфейс с помощью протокола делегата. Это позволит вам установить контроллер как делегат MKMapView в Interface Builder (IB). Откройте файл .xib, содержащий вашу карту, щелкните правой кнопкой мыши MKMapView и перетащите выход delegate на ваш контроллер.
Если вы предпочитаете использовать код вместо IB, добавьте self.yourMapView.delegate=self; в метод viewDidLoad контроллера. Результат будет таким же.

Реализовать 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;
}

Ответ 2

Переопределить метод делегата mapView:viewForAnnotation:. Если параметр annotation указывает на одну из ваших пользовательских аннотаций, верните пользовательский вид, который будет вам по душе.

Ответ 3

Чтобы настроить собственное изображение вместо стандартного MKPinAnnotationView, единственный способ сделать это - использовать MKAnnotationView с функцией - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation. Вот пример:

- (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;
}

Для значения aView.image Вы можете установить собственное изображение. А также посмотрите MKAnnotationView ссылку класса, чтобы лучше справляться с ней.