2014-01-14 2 views
3

Я борюсь с этим. У меня есть карта с множеством контактов в небольшой области. Я хочу игнорировать выбор аннотации mapview, когда я долгое время нажимаю на карту, независимо от того, нажимаю ли я на аннотацию. Кажется, что аннотация выбирается на touchDown, а не нажимается внутри на аннотации, что раздражает.Игнорировать mapView: didSelectAnnotationView при длительном нажатии

Я добавил longpress жеста в MapView:

UILongPressGestureRecognizer *longRec = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(addPin:)]; 
longRec.cancelsTouchesInView = YES; 
[self.mapView addGestureRecognizer:longRec]; 

Это не распознается, когда я долгое нажатие над пояснительным. Как только я нажимаю кнопку «Удалить», запрос обработки аннотации обрабатывается, и длительное нажатие никогда не срабатывает.

Я попытался блокировать водопроводную жест распознаватель, который, конечно, не работает, потому что жесты MAPview в не делегированы мой взгляд карту контроллера, так что это не работает:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) { 
     return NO; 
    } 
    return YES; 
} 

Я также попытался добавления longpress жестом к представлению аннотации в качестве взлома, но это никогда не срабатывает, и мне все равно не нравится эта стратегия.

Есть ли способ заблокировать выбор аннотации mapview, когда жест longpress находится на рассмотрении в mapview?

ответ

2

Выяснено решение. В основном подклассификация MKMapView и реализация handleTap и handleLongPress.

Там я блокирую кран во время длительного нажатия. Я также дать небольшую задержку, чтобы обрабатывать случай, когда оба жесты одновременно признанные:

@implementation KWMapView // :MKMapView 

- (void)handleTap:(UITapGestureRecognizer *)tapGesture 
{ 
    CGPoint tapPoint = [tapGesture locationInView:self]; 
    NSUInteger numberOfTouches = [tapGesture numberOfTouches]; 

    if (numberOfTouches == 1 && tapGesture.state == UIGestureRecognizerStateEnded) { 
     if (!self.blockTap) { 
      id v = [self hitTest:tapPoint withEvent:nil]; 

      if ([v isKindOfClass:[MKAnnotationView class]]) { 
       [self addAnnotation:[v annotation]]; 
       [self selectAnnotation:[v annotation] animated:YES]; 
      } else { 
       [[NSNotificationCenter defaultCenter] postNotificationName:PNMapViewDidTapMap object:tapGesture]; 
      } 
     } 
    } 
} 

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    self.blockTap = YES; 

    if (sender.state == UIGestureRecognizerStateBegan) { 
     [[NSNotificationCenter defaultCenter] postNotificationName:PNMapViewDropPinGesture object:sender]; 
    } 

    if (sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateCancelled || sender.state == UIGestureRecognizerStateFailed) { 
     double delayInSeconds = .2; 
     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
      self.blockTap = NO; 
     }); 
    } 
} 
@end 
+0

+1 потому что у меня была очень похожая проблема, что я хотел иметь возможность сделать 2 вещи с аннотацией: выберите ее, чтобы вывести какую-либо другую информацию, ИЛИ перетащите ее в новое место ... и, конечно, когда вы перетаскиваете его, чтобы начать с него, обнаружив длительное нажатие, которое было обнаружено как выбор аннотации. Действительно полезный, помощник, приветствия, :) – bobsmells

+0

Я пробовал по-другому, который работал на длинную печать, но, похоже, для двойного щелчка. Любые ответы приветствуются здесь: http://stackoverflow.com/questions/35697397/why-is-double-tap-still-being-picked-up-in-this-ios-code – Greg

0

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

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