¿Cómo puedo detectar un solo toque en una instancia de MKMapView
? ¿Tengo que crear la subclase MKMapView
y luego anular el método touchesEnded
?iPhone: Detectando Tap en MKMapView
Gracias,
-Chris
¿Cómo puedo detectar un solo toque en una instancia de MKMapView
? ¿Tengo que crear la subclase MKMapView
y luego anular el método touchesEnded
?iPhone: Detectando Tap en MKMapView
Gracias,
-Chris
Esperamos que esto ayude: How to intercept touches events on a MKMapView or UIWebView objects?
Usted no puede en este momento toques de intercepción en una vista de mapa, se puede tratar de capas una vista opaca allí y ver si se recoge toques ...
O dependiendo de lo que esté intentando hacer, agregue un MKAnnotation
(alfiler de empuje, con una leyenda), para que tenga algo para tocar, y luego su delegado de mapa recibirá un evento, por ej.
mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
Si usted está buscando para ser notificado de los gestos del grifo sin afectar a cualquiera de los otros comportamientos táctil del mapa, tendrá que utilizar una UITapGestureRecognizer
. Es súper simple, solo coloca un código como este.
UITapGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(didTapMap:)];
[theMKMapView addGestureRecognizer:tapRec];
[tapRec release];
que llamará al didTapMap
cada vez que recibe un gesto theMKMapView
grifo y todos los gestos de pellizco, y arrastrando seguirá funcionando como lo hacían antes.
Para mí, configurar un selector no funcionó, pero funcionó al usar funciones de delegado (gestureRecognizerShouldBegin :) BTW, aunque el trabajo Tap and Pan, UIPinchGestureRecognizer no funciona, ni siquiera con las funciones de delegado. –
No estoy seguro de qué decirle sin más detalles que eso ... Usar un selector siempre me funciona. – pseudopeach
falta un punto, ir debe ser '@selector (didTapMap:)' – Ali
funcionando perfectamente en iOS 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 ...
}
sólo tienes que añadir el fragmento de código como ejemplo de respuesta @ tt-kilew. En mi caso, quiero señalar al usuario a sí mismo en el mapa, pero no quiero interrumpir su toque de arrastre.
@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
Nada de lo que se ha encontrado trabajados, pero se me ocurrió con esta solución unperfect: En viewDidLoad
let singleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(onMapClicked))
singleTapRecognizer.delegate = self
mapView.addGestureRecognizer(singleTapRecognizer)
En delegada:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return touch.view!.frame.equalTo(mapView.frame)
}
Esto ayudó, pero tiene problemas. Pero es mejor que nada ... – bentford
Sí, si lees en los comentarios hay otra solución. En realidad, hay una tercera forma de hacerlo (además de subclasificar MKMapView o superponer su propia vista en la parte superior y pasar los toques a MKMapView). En lugar de subclasificar MKMapView, subclase la ventana principal y pase los eventos táctiles tanto a MKMapView como a su vista. http://stackoverflow.com/questions/1121889/intercepting-hijacking-iphone-touch-events-for-mkmapview/1298330 No lo he probado todavía, pero aparentemente el rendimiento es mejor y pellizcar para hacer zoom todavía funciona. – ChrisJF
este enlace ya no es válido –