Создайте UITapGestureRecognizer
и установите numberOfTapsRequired
на 2
.Добавьте этот распознаватель жестов к вашему экземпляру MKPinAnnotationView
.Кроме того, вам нужно будет установить свой контроллер в качестве делегата распознавателя жестов и реализовать -gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
и вернуть YES
, чтобы предотвратить распознавание жестами распознавателя жестов на тех, которые используются внутри MKMapView
.
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation)annotation
{
// Reuse or create annotation view
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapRecgonized:)];
doubleTap.numberOfTapsRequired = 2;
doubleTap.delegate = self;
[annotationView addGestureRecognizer:doubleTap];
}
- (void)doubleTapRecognized:(UITapGestureRecognizer *)recognizer
{
// Handle double tap on annotation view
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGesture
{
return YES;
}
Редактировать: Извините, что неправильно понял.То, что вы описываете, должно быть возможно с помощью -mapView:didSelectAnnotationView:
и распознаватель жестов, настроенный только для 1 обязательного нажатия.Идея состоит в том, что мы добавим распознаватель жестов только к представлению аннотации, когда оно выбрано.Мы удалим его, когда просмотр аннотации будет отменен.Таким образом, вы можете обрабатывать масштабирование в методе -tapGestureRecognized:
, и оно гарантированно будет выполнено, только если аннотация уже была нажата.
Для этого я бы добавил распознаватель жестов в качестве свойства вашего класса и настроил егов -viewDidLoad
.Предположим, он объявлен как @property (nonatomic, strong) UITapGestureRecognizer *tapGesture;
и мы используем ARC.
- (void)viewDidLoad
{
[super viewDidLoad];
self.tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognized:)];
}
- (void)tapGestureRecognized:(UIGestureRecognizer *)gesture
{
// Zoom in even further on already selected annotation
}
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)annotationView
{
[annotationView addGestureRecognizer:self.tapGesture];
}
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)annotationView
{
[annotationView removeGestureRecgonizer:self.tapGesture];
}