Jednym ze sposobów jest wdrożenie metody UIGestureRecognizerDelegate
gestureRecognizer: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];
}
}
}
Dziękujemy, Twój wyjaśnienie było nie tylko użyteczne, ale bardzo szczegółowe – MegaManX
Dziękujemy, Twoja druga sugestia było dokładnie to, co było po! – MrDB
Świetna propozycja, to było to, czego szukałem. –