2009-08-14 6 views

Antwort

4
+0

Dies trug dazu bei, hat aber Probleme. Aber es ist besser als nichts ... – bentford

+1

Ja, wenn Sie in den Kommentaren lesen, gibt es eine andere Lösung. Es gibt tatsächlich eine dritte Möglichkeit, dies zu tun (neben der Unterteilung von MKMapView oder dem Überlagern einer eigenen Ansicht oben und Weitergeben der Berührungen an MKMapView). Anstatt MKMapView zu unterklassieren, unterlasse das Hauptfenster und übergebe die Berührungsereignisse sowohl an MKMapView als auch an deine Ansicht. http://stackoverflow.com/questions/1121889/intercepting-hijacking-iphone-touch-events-for-mkmapview/1298330 Habe dies noch nicht versucht, aber anscheinend ist die Leistung besser und Prise zum Zoomen funktioniert immer noch. – ChrisJF

+0

Dieser Link ist nicht mehr gültig –

1

Sie zu diesem Zeitpunkt abfangen berührt auf einer Karte kann nicht, können Sie dort Schichtung eine undurchsichtige Ansicht versuchen und sehen, ob es berührt nimmt ...

2

Oder, je nachdem, was Sie versuchen, fügen Sie eine MKAnnotation (Push-Pin, mit einem Callout), so dass Sie etwas zum Tippen haben - und dann erhält Ihre Map-Delegat ein Ereignis, z.

mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control

30

Wenn Sie gerade suchen Leitungs Gesten informiert werden, ohne dass eine der anderen Berührungsverhalten der Karte zu beeinflussen, Sie wollen ein verwenden UITapGestureRecognizer. Es ist sehr einfach, einfach Code wie folgt einfügen.

UITapGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] 
    initWithTarget:self action:@selector(didTapMap:)]; 
[theMKMapView addGestureRecognizer:tapRec]; 
[tapRec release]; 

dass die didTapMap rufen, wenn theMKMapView erhält eine Tippgeste und alle Kneifen und Ziehen Gesten noch funktioniert wie zuvor.

+0

Für mich funktionierte das Festlegen eines Selektors nicht, aber funktionierte bei der Verwendung von Delegate-Funktionen (GestenRecognizerShouldBegin :) BTW, obwohl Tap und Pan arbeiten, funktioniert UIPinchGestureRecognizer nicht, nicht einmal mit Delegate-Funktionen. –

+0

Ich bin mir nicht sicher, was ich Ihnen ohne weitere Details sagen soll ... Die Verwendung eines Selektors funktioniert immer für mich. – pseudopeach

+1

Ein Doppelpunkt fehlt, ir sollte '@selector (didTapMap:)' – Ali

2

Perfekt auf iOS Arbeiten 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

nur einigen Code-Schnipsel als Illustration von @ tt-kilew Antwort hinzuzufügen. In meinem Fall möchte ich den Benutzer auf sich selbst auf der Karte zeigen, aber nicht seine Drag-Touch unterbrechen.

@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

Nichts fand ich jemals gearbeitet, aber ich kam mit dieser unperfect Lösung: In viewDidLoad

let singleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(onMapClicked)) 
singleTapRecognizer.delegate = self 
mapView.addGestureRecognizer(singleTapRecognizer) 

In Delegierter:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { 
    return touch.view!.frame.equalTo(mapView.frame) 
}