2012-03-14 13 views
11

Oto, czego chcę - użytkownik klika na mapie, mój kod zostaje wykonany, a następnie uruchamiany jest kod systemowy (jeśli użytkownik kliknął na objaśnienie adnotacji, itp.).Jak mogę przechwycić MapView, a następnie przekazać go do domyślnego rozpoznawania gestów?

Dodałem prosty kranu rozpoznawania do widoku mapy:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapViewTapped:)]; 
[self.mapView addGestureRecognizer:tapGestureRecognizer]; 
[tapGestureRecognizer release]; 

Wewnątrz mapViewTapped mój kod zostanie wykonany. Teraz chcę powiadomić kod systemowy dotknięcia (na przykład, aby pokazać objaśnienie). Jak mogę to zrobić? Jak przekazać zdarzenie, które przechwyciłem?

Odpowiedz

23

Jednym ze sposobów jest wdrożenie metody UIGestureRecognizerDelegategestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: i powrócić YES w nim:

//add <UIGestureRecognizerDelegate> to .h to avoid compiler warning 

//add this where you create tapGestureRecognizer... 
tapGestureRecognizer.delegate = self; 

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 

teraz Twój mapViewTapped: zostanie sprawdzony a następnie rozpoznawania widoku mapy będzie wywołać jej metody. Jeśli stuknięcie było w widoku adnotacji, widok mapy wyświetli jego objaśnienie (zostanie wywołana metoda delegata didSelectAnnotationView, jeśli została zaimplementowana).


Innym sposobem, jeśli potrzebujesz więcej kontroli, a następnie zamiast robić z powyższym, w swojej mapViewTapped: można sprawdzić, czy kran był na widoku opisu, a następnie ręcznie wybrać adnotację, która pokaże jego objaśnienie (i wywołać metodę didSelectAnnotationView delegata):

-(void)mapViewTapped:(UITapGestureRecognizer *)tgr 
{ 
    CGPoint p = [tgr locationInView:mapView]; 

    UIView *v = [mapView hitTest:p withEvent:nil]; 

    id<MKAnnotation> ann = nil; 

    if ([v isKindOfClass:[MKAnnotationView class]]) 
    { 
     //annotation view was tapped, select it... 
     ann = ((MKAnnotationView *)v).annotation; 
     [mapView selectAnnotation:ann animated:YES]; 
    } 
    else 
    { 
     //annotation view was not tapped, deselect if some ann is selected... 
     if (mapView.selectedAnnotations.count != 0) 
     { 
      ann = [mapView.selectedAnnotations objectAtIndex:0]; 
      [mapView deselectAnnotation:ann animated:YES]; 
     } 
    } 
} 
+0

Dziękujemy, Twój wyjaśnienie było nie tylko użyteczne, ale bardzo szczegółowe – MegaManX

+1

Dziękujemy, Twoja druga sugestia było dokładnie to, co było po! – MrDB

+0

Świetna propozycja, to było to, czego szukałem. –

Powiązane problemy