Я так понимаю, вам нужен пин-код с пользовательским выноской.
Мы не можем создать пользовательскую выноску, но мы можем создать аннотацию с полностью настроенным видом.Таким образом, хитрость заключается в том, чтобы добавить вторую аннотацию, когда выбрана первая, и сделать 2-й вид аннотации похожим на пузырь выноски.
Это решение, отправленное пользователями djibouti33 и jacob-jennings в ответе: MKAnnotationView - блокировка пользовательского представления аннотации для закрепления обновлений местоположения , которое, в свою очередь, основано на сообщении в блоге от Asynchrony Solutions.Для объяснения, вот несколько UML из разветвленного проекта:
Это большой взлом, но также и самый чистый способ реализации пользовательских аннотаций.
Начните с класса 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.