Настройте выноску MKAnnotationView - PullRequest
42 голосов
/ 05 ноября 2011

Я хочу создать пользовательскую выноску MKAnnotationView, как показано на этом рисунке. Я протестировал несколько решений, но они позволяют настраивать только левые / правые изображения и заголовок / субтитры. Кто-нибудь может дать мне какой-нибудь исходный код или ссылку на учебник для него?

В настоящее время я не в курсе. Пожалуйста, помогите.

enter image description here

Ответы [ 3 ]

49 голосов
/ 05 ноября 2011

Я так понимаю, вам нужен пин-код с пользовательским выноской.

Мы не можем создать пользовательскую выноску, но мы можем создать аннотацию с полностью настроенным видом.Таким образом, хитрость заключается в том, чтобы добавить вторую аннотацию, когда выбрана первая, и сделать 2-й вид аннотации похожим на пузырь выноски.

Это решение, отправленное пользователями djibouti33 и jacob-jennings в ответе: MKAnnotationView - блокировка пользовательского представления аннотации для закрепления обновлений местоположения , которое, в свою очередь, основано на сообщении в блоге от Asynchrony Solutions.Для объяснения, вот несколько UML из разветвленного проекта: Annotation with custom XIB

Это большой взлом, но также и самый чистый способ реализации пользовательских аннотаций.

Начните с класса NSObject "Content", у которого есть координата, класс представления выноски для использования (в UML есть AnnotationView, но вы можете создать больше и установить их здесь) и словарь случайных чиселзначения с заголовком, URL-адресом фотографии и т. д. Используйте этот класс для инициализации объекта «Аннотация» MKAnnotation.

#import <MapKit/MapKit.h>
@interface Content : NSObject
@property (nonatomic,assign) CLLocationCoordinate2D coordinate;
// ...

@interface Annotation : NSObject <MKAnnotation, AnnotationProtocol>
-(id) initWithContent:(Content*)content;
// ...

Аннотация реализует протокол AnnotationProtocol, чтобы объявить, что он хочет обработать создание своего собственного представления MKAnnotationView.То есть ваш MKMapViewDelegate должен иметь такой код:

- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id<MKAnnotation>)annotation 
{
    // if this is a custom annotation, delegate the implementation of the view
    if ([annotation conformsToProtocol:@protocol(AnnotationProtocol)]) {
        return [((NSObject<AnnotationProtocol>*)annotation) annotationViewInMap:mapView];
    } else {
        // else, return a standard annotation view
        // ...
    }
} 

Возвращаемое представление будет иметь тип AnnotationView, который реализует AnnotationViewProtocol для объявления о том, что он хочет обрабатывать выбор / отмену выбора.Поэтому в вашем контроллере представления карты методы mapView: didSelectAnnotationView: и mapView: didDeselectAnnotationView: должны делегировать аналогично тому, что мы видели ранее.

Когда выбрана аннотация, появляется вторая аннотация (CalloutAnnotation)добавлен, что соответствует тому же поведению, но на этот раз возвращаемое представление (CalloutView) инициализируется из XIB и содержит код Core Graphics (в BaseCalloutView) для анимации и репликации выноски.

Инициализатор CalloutViewкласс:

- (id)initWithAnnotation:(CalloutAnnotation*)annotation
{
    NSString *identifier = NSStringFromClass([self class]);
    self = [super initWithAnnotation:annotation reuseIdentifier:identifier];
    if (self!=nil){
        [[NSBundle mainBundle] loadNibNamed:identifier owner:self options:nil];
        // prevent the tap and double tap from reaching views underneath
        UITapGestureRecognizer *tapGestureRecognizer = ...
    }
    return self;
}

Чтобы иметь возможность выдвинуть другой контроллер представления из представления выноски, я использовал уведомления.

Ответ SO, который я связал вверху, содержит два полных проекта, реализующих этот код (классимена могут отличаться).У меня есть другой проект, использующий UML выше на https://github.com/j4n0/callout.

0 голосов
/ 17 октября 2018

Я знаю, что этот вопрос относится к 2011 году, но для людей, которые все еще находят его в поиске: в iOS 9 у вас есть MKAnnotationView.detailCalloutAccessoryView, который полностью заменяет стандартную выноску.

0 голосов
/ 23 апреля 2012

Я добавил пользовательский UIButton в MKAnnotationView.И по нажатию этой кнопки я показал popOver с rootViewController с видом, подобным тому, который вы показали выше.

...