¿Cómo detecto un solo toque en una instancia de MKMapView? ¿Debo hacer una subclase MKMapViewy luego anular el touchesEndedmétodo?
Gracias,
-Chris
¿Cómo detecto un solo toque en una instancia de MKMapView? ¿Debo hacer una subclase MKMapViewy luego anular el touchesEndedmétodo?
Gracias,
-Chris
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 usar una UITapGestureRecognizer. Es súper sencillo, sólo hay que poner en algún código como este.
UITapGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(didTapMap:)];
[theMKMapView addGestureRecognizer:tapRec];
[tapRec release];
Eso va a llamar a la didTapMapcada vez theMKMapViewrecibe un gesto de pulsar y todo el pellizco, y los gestos de arrastre seguirá funcionando como lo hacían antes.
Espero que esto ayude: ¿cómo interceptar toques de eventos en un objeto MKMapView o UIWebView?
Trabajando 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 ...
}
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 del mapa recibirá un evento, por ej.
mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
mis 2 centavos para 5.x Swit:
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let v = touch.view
let ssv = v?.superview?.superview
if ssv === self.mapView{
searchBar.resignFirstResponder()
}
}
}
funciona. pero honestamente puede romperse si se cambia la manzana capas de puntos de vista. Mejor un reconocedor.
Nada de lo que encontré 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)
}
Sólo tiene que añadir algunos fragmentos 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
En este momento no puedes interceptar toques en una vista de mapa, puedes intentar poner una vista opaca en capas y ver si toca ...