Quando si visualizzano le indicazioni sulla Maps.app integrata sull'iPhone, è possibile "selezionare" una delle 3 alternative di percorso normalmente visualizzate toccando su di essa. Non voglio replicare questa funzionalità e controllare se un rubinetto si trova all'interno di una determinata MKPolyline.Come rilevare i tocchi su MKPolylines/Overlay come Maps.app?
Attualmente mi rilevare rubinetti sul MapView come questo:
// 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];
gestisco i rubinetti come segue:
- (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]];
}
}
}
}
Questo funziona come previsto, ora ho bisogno di controllare se il rubinetto si trova all'interno il dato overlayView di MKPolyline (non severo, l'utente tocca da qualche parte vicino alla polilinea che dovrebbe essere gestito come un colpo).
Qual è un buon modo per farlo?
- (void)handleTapAtPoint:(CGPoint)point {
MKPolyline *polyline = self.polyline;
// TODO: detect if point lies withing polyline with some margin
}
Grazie!
ottima soluzione, funzionante bene :), grazie – polo987
Questa è una buona soluzione. Una domanda, cosa si calcola esattamente qui? double u = ((pt.x - ptA.x) * xDelta + (pt.y - ptA.y) * yDelta)/(xDelta * xDelta + yDelta * yDelta); ...Mi sono perso da lì, potresti aggiungere qualche commento per spiegare cosa viene calcolato da lì e da sotto? – Bocaxica
@Bocaxica quella parte non è il mio codice. Si prega di fare riferimento a http://paulbourke.net/geometry/pointlineplane/ – Jensemann