2012-11-26 11 views
8

Chcę upuścić pinezkę na moim MKMapView, gdy pojedynczy użytkownik dotknie mapy. Mam działający kod PIN, mam działający pojedynczy kran, ale kiedy dwukrotnie dotknę, aby powiększyć, najpierw otrzymuję pojedyncze dotknięcie. Oto mój kod, aby uzyskać konfigurację aparatów rozpoznawania:Pojedynczy Stuknij, aby MKMapView bez przerywanego dwukrotnego kliknięcia powiększ

self.doubleTap = [[UITapGestureRecognizer alloc] 
         initWithTarget:self action:@selector(handleDoubleTap:)]; 
    self.doubleTap.numberOfTapsRequired = 2; 
    self.doubleTap.numberOfTouchesRequired = 1; 
    [mapView_ addGestureRecognizer:doubleTap_]; 

    self.singleTap = [[UITapGestureRecognizer alloc] 
         initWithTarget:self action:@selector(handleGesture:)]; 
    self.singleTap.numberOfTapsRequired = 1; 
    self.singleTap.numberOfTouchesRequired = 1; 
    [self.singleTap requireGestureRecognizerToFail: doubleTap_]; 
    [mapView_ addGestureRecognizer:singleTap_]; 

Teraz nie jest to zaskakujące, zacytować Apple:

Uwaga: W przypadku pojedynczej beczki kontra gestów Stuknij dwukrotnie, jeżeli a jednokrotnego rozpoznawania gestów nie wymaga dwukrotnego dotknięcia rozpoznawania , dlatego należy spodziewać się pojedynczego uderzenia przed akcjami podwójnego dotknięcia, nawet w przypadku podwójnego dotknięcia . Jest to oczekiwane i pożądane zachowanie, ponieważ najlepsze doświadczenie użytkownika zazwyczaj wiąże się z możliwością ustawiania w stos.

Dodałem więc requireGestureRecognizerToFail do mojego pojedynczego czytnika zaczepów.

[singleTap requireGestureRecognizerToFail: doubleTap];

To zapewnia, że ​​mój pojedynczy czytnik nie dostanie podwójnego dotknięcia.

Ale ...

Teraz mój double tap rozpoznawania dostaje podwójne krany i MKMapView nie je dostać. Próbowałem ustawić cancelsTouchesInView na NO w urządzeniu rozpoznającym, ale to też nie pomogło.

Potrzebuję więc sposobu, aby zapobiec sytuacji, w której mój pojedynczy czytnik zaczepów otrzymywał podwójne kliknięcia (co wydaje się mało prawdopodobne) lub aby moje zdarzenie dwukrotnego dotknięcia było wyświetlane w moim widoku mapy.

+0

Czy możesz pokazać kod, którego używasz do dodawania identyfikatorów gestów? Którą wersję systemu iOS testujesz? Czy próbowałeś powrócić TAK z metody delegowania shouldRecognizeSimultaneouslyWithGestureRecognizer? – Anna

+0

pytanie edytowane, aby mieć więcej kodu. Testuję z iOS5.1. Nie próbowałem delegata PowinieneZostaćZeuropejskiegoWithGestureRecognizer, zrobię to teraz. –

+0

shouldRecognizeSimultaneouslyWithGestureRecognizer = YES podstęp, utwórz tę odpowiedź, a ja oznaczy ją jako poprawną. Dzięki! –

Odpowiedz

2

Opublikowany kod wydaje się działać poprawnie tak jak w iOS 6.
Dwukrotne dotknięcie jest obsługiwane automatycznie w widoku mapy bez zakłócania jednokrotnego stuknięcia.

w iOS 5.x, aby uzyskać widok mapy, aby wykonać swoją normalną obsługę dwukrotnie kranu bez ingerencji z pojedynczej beczki, wdrożenie metody shouldRecognizeSimultaneouslyWithGestureRecognizer delegata i powrócić YES z niej (trzeba ustawić właściwość delegate tylko dwukanałowy aparat do rozpoznawania gestów).

Nie wiem, dlaczego nie jest to konieczne w iOS 6.

0

znalazłem this post że pomógł mi sporo ...
Zasadniczo trzeba znaleźć Apple gest rozpoznawania i upewnij się, że nie konkurować z nim.

Rozwiązanie Jonathana było prawie idealne, z wyjątkiem jednego:
Ponieważ w iOS 7 MKView ma wszystkie swoje gesty w wyglądzie. Jest to wygodne, jeśli chcesz rozróżnić, które są twoje (dodane bezpośrednio do MKMap) i które są Apple, ale może się gdzieś podziałać w przyszłości ...

Co w końcu robiłem, to przejść przez wszystkie podgląd na mapie, mając nadzieję, że będzie on wystarczająco elastyczny, aby wytrzymać przynajmniej niektóre przyszłe zmiany ...

wyglądać tak:

- (void) hackInTheGestureRecognizer { 

    for (UIView *aSubview in [[self theMap] subviews]) { 

     if ([aSubview isMemberOfClass:[UIView class]]) { 

      for (UIGestureRecognizer *aRecognizer in [aSubview gestureRecognizers]) { 

       if ([aRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { 

        if ([(UITapGestureRecognizer *) aRecognizer numberOfTapsRequired] == 2) { 

         [[self singleTapRecognizer] requireGestureRecognizerToFail:aRecognizer]; 
        } 
       } 
      } 
     } 
    } 
} 
4

działał prawidłowo na iOS 8, podwójne działanie kranu jest zerowa

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

     UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:nil]; 
     doubleTap.numberOfTapsRequired = 2; 
     doubleTap.numberOfTouchesRequired = 1; 
     [self.mapView addGestureRecognizer:doubleTap]; 

     UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; 
     singleTap.numberOfTapsRequired = 1; 
     singleTap.numberOfTouchesRequired = 1; 
     [singleTap requireGestureRecognizerToFail: doubleTap]; 
     [self.mapView addGestureRecognizer:singleTap]; 
    } 

    - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer 
    { 
      if (gestureRecognizer.state != UIGestureRecognizerStateEnded) 
       return; 
      //Do your work ... 
    } 
+0

To powinna być zaakceptowana odpowiedź. –

0

Swift 3 w wersji na iOS 10:

// Gesture recognizer set up in Interface Builder 
@IBOutlet weak var singleTapRecognizer: UITapGestureRecognizer! 

override func viewDidLoad() { 
    // double tap recognizer has no action 
    let doubleTapRecognizer = UITapGestureRecognizer(target: self, action: nil) 
    doubleTapRecognizer.numberOfTapsRequired = 2 
    doubleTapRecognizer.numberOfTouchesRequired = 1 
    mapView.addGestureRecognizer(doubleTapRecognizer) 

    singleTapRecognizer.require(toFail: doubleTapRecognizer) 
} 

Należy pamiętać, że pojedyncze kliknięcie jest tworzone w IB. Można go łatwo utworzyć w następujący sposób:

let singleTapRecognizer = UITapGestureRecognizer(target: self, action: Selector("someAction")) 
    singleTapRecognizer.numberOfTapsRequired = 1 
    singleTapRecognizer.numberOfTouchesRequired = 1 
    mapView.addGestureRecognizer(singleTapRecognizer) 
Powiązane problemy