Beim Anzeigen von Anweisungen auf der integrierten Maps.app auf dem iPhone können Sie eine der normalerweise angezeigten drei Routenalternativen auswählen, indem Sie darauf tippen. Ich möchte diese Funktionalität replizieren und prüfen, ob ein Tap innerhalb einer bestimmten MKPolyline liegt.Wie erkennen Sie Taps auf MKPolylines/Overlays wie Maps.app?
Derzeit erfassen ich Taps auf dem MapView wie folgt aus:
// Add Gesture Recognizer to MapView to detect taps
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleMapTap:)];
// we require all gesture recognizer except other single-tap gesture recognizers to fail
for (UIGestureRecognizer *gesture in self.gestureRecognizers) {
if ([gesture isKindOfClass:[UITapGestureRecognizer class]]) {
UITapGestureRecognizer *systemTap = (UITapGestureRecognizer *)gesture;
if (systemTap.numberOfTapsRequired > 1) {
[tap requireGestureRecognizerToFail:systemTap];
}
} else {
[tap requireGestureRecognizerToFail:gesture];
}
}
[self addGestureRecognizer:tap];
ich die Hähne behandeln wie folgt:
- (void)handleMapTap:(UITapGestureRecognizer *)tap {
if ((tap.state & UIGestureRecognizerStateRecognized) == UIGestureRecognizerStateRecognized) {
// Check if the overlay got tapped
if (overlayView != nil) {
// Get view frame rect in the mapView's coordinate system
CGRect viewFrameInMapView = [overlayView.superview convertRect:overlayView.frame toView:self];
// Get touch point in the mapView's coordinate system
CGPoint point = [tap locationInView:self];
// Check if the touch is within the view bounds
if (CGRectContainsPoint(viewFrameInMapView, point)) {
[overlayView handleTapAtPoint:[tap locationInView:self.directionsOverlayView]];
}
}
}
}
Dies funktioniert wie erwartet, jetzt ich überprüfen müssen, wenn der Hahn liegt in die angegebene MKPolyline OverlayView (nicht streng, ich tippe irgendwo in der Nähe der Polylinie, sollte dies als Treffer behandelt werden).
Was ist ein guter Weg, dies zu tun?
- (void)handleTapAtPoint:(CGPoint)point {
MKPolyline *polyline = self.polyline;
// TODO: detect if point lies withing polyline with some margin
}
Vielen Dank!
große Lösung, funktioniert gut :) dank – polo987
Dies ist eine gute Lösung. Eine Frage, was genau wird hier berechnet? doppelt u = ((pt.x - ptA.x) * xDelta + (pt.y - ptA.y) * yDelta)/(xDelta * xDelta + yDelta * yDelta); ...Ich verlasse mich von da an. Könnten Sie ein paar Kommentare hinzufügen, um zu erklären, was von dort und von unten berechnet wird? – Bocaxica
@Bocaxica dieser Teil ist nicht mein Code. Siehe http://paulbourke.net/geometry/pointlineplane/ – Jensemann