Аннотирующий вид — это объект типа MKAnnotationView, он является подклассом от UIView. Если объект делегата картографического вида реализует метод делегата mapView: viewForAnnotation:, то объект делегата должен будет возвращать экземпляры класса MKAnnotationView, чтобы отображать (а при необходимости — настраивать) аннотирующие виды, которые выводятся поверх картографического вида.
Обсуждение
Чтобы обеспечить в нашей программе возможность настройки цвета меток (цвет будем выбирать из стандартной палитры, предусмотренной для меток в SDK), которые ставятся на картографическом виде для представления аннотаций, нам понадобится возвращать в методе делегата mapView: viewForAnnotation: не экземпляр класса MKAnnotationView, а экземпляр класса MKPinAnnotationView. Не забывайте, что класс MKPinAnnotationView является подклассом MKAnnotationView.
— (MKAnnotationView *)mapView:(MKMapView *)mapView
viewForAnnotation:(id
MKAnnotationView *result = nil;
if ([annotation isKindOfClass: [MyAnnotation class]] == NO){
return result;
}
if ([mapView isEqual: self.myMapView] == NO){
/* Мы собираемся обработать это событие только для того Map View,
который создали ранее. */
return result;
}
/* Сначала приводим тип той аннотации, для которой этот Map View
запустил данное сообщение делегата. */
MyAnnotation *senderAnnotation = (MyAnnotation *)annotation;
/* С помощью метода класса, определенного нами в собственном
классе аннотаций, мы попытаемся сделать многоразовый идентификатор
для того маркера, который сейчас создаем. */
NSString *pinReusableIdentifier =
[MyAnnotation
reusableIdentifierforPinColor: senderAnnotation.pinColor];
/* Пользуясь идентификатором, полученным ранее, попытаемся
повторно применить маркер в отправляющем Map View. */
MKPinAnnotationView *annotationView = (MKPinAnnotationView *)
[mapView
dequeueReusableAnnotationViewWithIdentifier: pinReusableIdentifier];
if (annotationView == nil){
/* Если нам не удастся повторно использовать имеющийся маркер,
создадим новый. */
annotationView = [[MKPinAnnotationView alloc]
initWithAnnotation: senderAnnotation
reuseIdentifier: pinReusableIdentifier];
/* Убеждаемся, что видны выноски поверх каждого маркера в случае,
если мы присвоили каждому маркеру заголовок и/или подзаголовок. */
[annotationView setCanShowCallout: YES];
}
/* Теперь (независимо от того, использовали мы многоразовый маркер
или создали новый) убеждаемся, что цвет маркера совпадает с цветом
аннотации. */
annotationView.pinColor = senderAnnotation.pinColor;
result = annotationView;
return result;
}
При многократном использовании аннотирующего вида ему присваивается идентификатор (строка NSString). Определяя, маркер какого типа вы хотели бы отобразить на карте, и задавая уникальный идентификатор для маркера каждого типа (например, к одному типу могут относиться красные маркеры, а к другому — синие), следует многократно использовать маркеры нужного типа, применяя метод экземпляра dequeueReusableAnnotationViewWithIdentifier:, относящийся к классу MKMapView. Это показано в следующем коде.
Мы запрограммировали механизм получения уникальных идентификаторов каждого маркера в собственном классе MyAnnotation. Вот. h-файл класса MyAnnotation:
#import
#import
/* Это стандартные цвета меток, присутствующие в SDK. Мы задаем уникальные