iPhone: Detectando Tap en MKMapView

votos
19

¿Cómo detecto un solo toque en una instancia de MKMapView? ¿Debo hacer una subclase MKMapViewy luego anular el touchesEndedmétodo?

Gracias,

-Chris

Publicado el 14/08/2009 a las 03:22
fuente por usuario
En otros idiomas...                            


8 respuestas

votos
31

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.

Respondida el 31/12/2010 a las 21:30
fuente por usuario

Respondida el 10/11/2009 a las 13:27
fuente por usuario

votos
2

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 ...
     }
Respondida el 03/04/2015 a las 10:46
fuente por usuario

votos
2

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

Respondida el 18/09/2009 a las 09:31
fuente por usuario

votos
0

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.

Respondida el 16/09/2019 a las 19:19
fuente por usuario

votos
0

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)
}
Respondida el 20/09/2017 a las 06:34
fuente por usuario

votos
0

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
Respondida el 07/04/2017 a las 10:59
fuente por usuario

votos
0

En este momento no puedes interceptar toques en una vista de mapa, puedes intentar poner una vista opaca en capas y ver si toca ...

Respondida el 14/08/2009 a las 03:59
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more