Jak wykrywać pojedyncze stuknięcie instancji MKMapView
? Czy muszę podklasę MKMapView
, a następnie przesłonić metodę touchesEnded
?iPhone: Wykrywanie Stuknij w MKMapView
Dzięki,
-Chris
Jak wykrywać pojedyncze stuknięcie instancji MKMapView
? Czy muszę podklasę MKMapView
, a następnie przesłonić metodę touchesEnded
?iPhone: Wykrywanie Stuknij w MKMapView
Dzięki,
-Chris
nadzieję, że pomoże: How to intercept touches events on a MKMapView or UIWebView objects?
cant w tej chwili dotyka wyrazu wolnego w widoku mapy, można spróbować warstw nieprzezroczystą widok na tam i zobaczyć, czy to podnosi dotyka ...
Lub w zależności od tego, co próbujesz zrobić, dodaj MKAnnotation
(pinezkę, z objaśnieniami), więc musisz coś dotknąć - a wtedy delegat mapy otrzyma np. Wydarzenie.
mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
Jeśli szukasz po prostu, aby otrzymywać powiadomienia gestów zaczepów bez wpływu na inne zachowania dotykowym mapie, będziemy chcieli, aby użyć UITapGestureRecognizer
. To bardzo proste, po prostu wstaw taki kod.
UITapGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(didTapMap:)];
[theMKMapView addGestureRecognizer:tapRec];
[tapRec release];
To wywoła didTapMap
ilekroć theMKMapView
odbiera gest kranu i wszystkie szczypanie, i przeciągając gesty będą nadal działać tak jak wcześniej.
Ustawienie selektora nie zadziałało, ale działało, gdy używane są funkcje delegowania (gestRecognizerShouldBegin :) BTW, chociaż praca Tap i Pan działa, UIPinchGestureRecognizer nie działa, nawet nie korzystając z funkcji delegowanych. –
Nie jestem pewien, co powiedzieć bez bardziej szczegółowych informacji ... Używanie selektora zawsze działa dla mnie. – pseudopeach
brakuje dwukropka, ir powinno być '@selector (didTapMap:)' – Ali
działał prawidłowo na iOS 8
- (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 ...
}
Wystarczy dodać jakiś fragment kodu jako ilustracja @ TT-kilew odpowiedź. W moim przypadku chcę skierować użytkownika na mapę, ale nie chcę przerywać jego przeciągania.
@interface PrettyViewController() <MKMapViewDelegate>
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (assign, nonatomic) BOOL userTouchTheMap;
@end
@implementation PrettyViewController
#pragma mark - UIResponder
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
self.userTouchTheMap = [[touches anyObject].view isEqual:self.mapView];
}
#pragma mark - MKMapViewDelegate
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
//We just positioning to user
if (!self.userTouchTheMap) {
CLLocationDistance radius = 5000;
[self.mapView setRegion:MKCoordinateRegionMakeWithDistance(userLocation.location.coordinate, 2*radius, 2*radius) animated:YES];
}
}
@end
Nic kiedykolwiek znaleziono obrobione, ale wymyśliłem tego unperfect rozwiązanie: W viewDidLoad
let singleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(onMapClicked))
singleTapRecognizer.delegate = self
mapView.addGestureRecognizer(singleTapRecognizer)
W delegata:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return touch.view!.frame.equalTo(mapView.frame)
}
to pomogło, ale ma problemy. Ale to lepsze niż nic ... – bentford
Tak, jeśli czytasz w komentarzach, jest inne rozwiązanie. Tak naprawdę jest to trzeci sposób (poza podklasowaniem MKMapView lub warstwowaniem własnego widoku na górze i przekazywaniem dotknięć do MKMapView). Zamiast podklasować MKMapView, podklasuj główne okno i przekazuj zdarzenia dotykowe zarówno do MKMapView, jak i do widoku. http://stackoverflow.com/questions/1121889/intercepting-hijacking-iphone-touch-events-for-mkmapview/1298330 Nie próbowałem tego jeszcze, ale widocznie wydajność jest lepsza, a szczypta zoomu nadal działa. – ChrisJF
Ten link nie jest już ważny –