Двойной выбор касания на MKPinAnnotationView - PullRequest
0 голосов
/ 10 января 2012

Редактировать: название изменилось с: «Двойное касание ..» на «Двойное касание ..»

Мне нужно обнаружить, по крайней мере, второе прикосновение к MKPinAnnotationView в моем приложении. В настоящее время я могу получить первое касание (я использую kvo отсюда: Обнаружение, когда MKAnnotation выбран в MKMapView ), и это прекрасно работает с первым касанием), но если я коснусь снова на Пин, ничего не вызывается, потому что выбранное значение не меняется. Я попробовал то же самое, используя «mapView: didSelectAnnotationView:», который работает с ios 4, но также не вызывается снова при втором нажатии.

Если кто-то может помочь мне с этим, было бы здорово!

С наилучшими пожеланиями

Редактировать, добавить дополнительную информацию:

Таким образом, касания не должны быть быстрыми, если пользователь касается булавки, я покажу сообщение в заголовке и подзаголовке аннотации, если пользователь снова коснется того же пина, поэтому я сделаю еще один вещь с этим

1 Ответ

4 голосов
/ 10 января 2012

Создайте 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];
}
...