Wie erkenne ich einen einzelnen Tipp auf eine Instanz von MKMapView
? Muss ich die Klasse MKMapView
ableiten und dann die Methode touchesEnded
außer Kraft setzen?iPhone: Erkennen von Tippen in MKMapView
Danke,
-Chris
Wie erkenne ich einen einzelnen Tipp auf eine Instanz von MKMapView
? Muss ich die Klasse MKMapView
ableiten und dann die Methode touchesEnded
außer Kraft setzen?iPhone: Erkennen von Tippen in MKMapView
Danke,
-Chris
Hope this helfen: How to intercept touches events on a MKMapView or UIWebView objects?
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 ...
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
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.
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. –
Ich bin mir nicht sicher, was ich Ihnen ohne weitere Details sagen soll ... Die Verwendung eines Selektors funktioniert immer für mich. – pseudopeach
Ein Doppelpunkt fehlt, ir sollte '@selector (didTapMap:)' – Ali
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 ...
}
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
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)
}
Dies trug dazu bei, hat aber Probleme. Aber es ist besser als nichts ... – bentford
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
Dieser Link ist nicht mehr gültig –