Пользовательское изображение для 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
ссылку класса, чтобы лучше справляться с ней.