Podczas wyświetlania wskazówek na wbudowanej aplikacji Maps.app na iPhonie, możesz "wybrać" jedną z 3 najczęściej wyświetlanych tras, naciskając na nią. Nie chcę replikować tej funkcjonalności i sprawdzać, czy dany kran znajduje się w danej MKPolinie.Jak wykrywać krany na MKPolylines/Overlays jak Maps.app?
Obecnie wykryć kranów na MapView tak:
// 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];
obsłużyć kurki następująco:
- (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]];
}
}
}
}
to działa zgodnie z oczekiwaniami, teraz muszę sprawdzić, czy kran leży dana nakładka widoku MKPolyline (nie ścisłe, ja użytkownik klika gdzieś w pobliżu polilinii powinno to być traktowane jako trafienie).
Co to jest dobry sposób na zrobienie tego?
- (void)handleTapAtPoint:(CGPoint)point {
MKPolyline *polyline = self.polyline;
// TODO: detect if point lies withing polyline with some margin
}
Dzięki!
świetne rozwiązanie, działa dobrze :), dzięki – polo987
To jest dobre rozwiązanie. Jedno pytanie, co dokładnie tutaj jest obliczane? podwójny u = ((pt.x - ptA.x) * xDelta + (pt.y - ptA.y) * yDelta)/(xDelta * xDelta + yDelta * yDelta); ...W pewnym sensie się zgubiłem, czy mógłbyś dodać komentarze, by wyjaśnić, co jest obliczane z tego miejsca i poniżej? – Bocaxica
@Bocaxica ta część nie jest moim kodem. Proszę zapoznać się z http://paulbourke.net/geometry/pointlineplane/ – Jensemann