2009-08-14 7 views

Odpowiedz

4
+0

to pomogło, ale ma problemy. Ale to lepsze niż nic ... – bentford

+1

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

+0

Ten link nie jest już ważny –

1

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 ...

2

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

30

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.

+0

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. –

+0

Nie jestem pewien, co powiedzieć bez bardziej szczegółowych informacji ... Używanie selektora zawsze działa dla mnie. – pseudopeach

+1

brakuje dwukropka, ir powinno być '@selector (didTapMap:)' – Ali

2

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 ... 
    } 
0

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 
0

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) 
}