3

Я добавил UITapGestureRecognizer к MKMapView, например, так:UITapGestureRecognizer на MKMapView ломает выбор MKAnnotation

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
             initWithTarget:self 
             action:@selector(doStuff:)]; 
[tapGesture setCancelsTouchesInView:NO]; 
[tapGesture setDelaysTouchesEnded:NO]; 
[[self myMap] addGestureRecognizer:tapGesture]; 
[tapGesture release]; 

Это почти работает: нажмите жесты распознаются и двойные отводы по-прежнему изменять масштаб карты. К сожалению, UITapGestureRecognizer вмешивается в выбор и отключение элементов MKAnnotationView, которые также запускаются жесты касания.

Установка свойств setCancelsTouchesInView и setDelaysTouchesEnded не имеет значения. Выбор аннотации работает отлично, если я не добавляю UIGestureRecognizer.

Что мне не хватает?

UPDATE:

Как было предложено ниже Анны Карениной, эту проблему можно избежать путем возвращения YES в методе shouldRecognizeSimultaneouslyWithGestureRecognizer: делегата.

Подробнее в this answer.

+1

Скорее всего, вам понадобится подкласс MKMapView и перезаписать 'touchhesBegan:' и т. Д. Вместо использования распознавателей жестов. Оттуда вы можете определить, возникло ли прикосновение из аннотации и передать его в супер-представление или захватить его в зависимости от вашей реализации. – Rog

+3

Попробуйте [этот ответ] (http://stackoverflow.com/a/6455734/467105), в котором предлагается внедрить shouldRecognizeSimultaneousWithGestureRecognizer. – Anna

+0

Спасибо за ответы! @ Ответ АнныКаренины сделал трюк. Нет необходимости подкласса MKMapView. – carton

ответ

0
Instead of tap gesture,add long press gesture as below:- 

UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] 
    initWithTarget:self action:@selector(longpressToGetLocation:)]; 
lpgr.minimumPressDuration = 2.0; //user must press for 2 seconds 
[mapView addGestureRecognizer:lpgr]; 
[lpgr release]; 


- (void)longpressToGetLocation:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan) 
     return; 

    CGPoint touchPoint = [gestureRecognizer locationInView:self.mapView]; 
    CLLocationCoordinate2D location = 
     [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView]; 

    NSLog(@"Location found from Map: %f %f",location.latitude,location.longitude); 

} 
+0

Я получил его для работы с жестом tap, реализуя 'shouldRecognizeSimultaneousWithGestureRecognizer:' (см. Выше) – carton

Смежные вопросы