31 votos

Cómo capturar Toque gesto en MKMapView

Estoy tratando de capturar toque evento en mi MKMapView, de esta forma, se puede colocar un MKPinAnnotation en el punto donde el usuario aprovechado. Básicamente tengo un mapa superpuesto con MKOverlayViews (una superposición mostrando un edificio) y me gustaría dar al usuario más información acerca de Superposición cuando se pulse sobre él por la caída de una MKPinAnnotaion y mostrando más información en la anotación. Gracias.

59voto

Anna Puntos 44332

Usted puede utilizar un UIGestureRecognizer para detectar toques en la vista de mapa.

En lugar de un solo toque, sin embargo, sugiero que se busca un doble toque (UITapGestureRecognizer) o una pulsación larga (UILongPressGestureRecognizer). Un solo toque puede interferir con el usuario tratando de simple toque en el pin de llamada o de sí mismo.

En el lugar donde la configuración de la vista de mapa (en viewDidLoad por ejemplo), adjuntar el gesto de reconocimiento a la vista del mapa:

UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] 
    initWithTarget:self action:@selector(handleGesture:)];
tgr.numberOfTapsRequired = 2;
tgr.numberOfTouchesRequired = 1;
[mapView addGestureRecognizer:tgr];
[tgr release];

o, para usar una pulsación larga:

UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] 
    initWithTarget:self action:@selector(handleGesture:)];
lpgr.minimumPressDuration = 2.0;  //user must press for 2 seconds
[mapView addGestureRecognizer:lpgr];
[lpgr release];


En la handleGesture: método de:

- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer.state != UIGestureRecognizerStateEnded)
        return;

    CGPoint touchPoint = [gestureRecognizer locationInView:mapView];
    CLLocationCoordinate2D touchMapCoordinate = 
        [mapView convertPoint:touchPoint toCoordinateFromView:mapView];

    MKPointAnnotation *pa = [[MKPointAnnotation alloc] init];
    pa.coordinate = touchMapCoordinate;
    pa.title = @"Hello";
    [mapView addAnnotation:pa];
    [pa release];
}

5voto

o0oKodako0o Puntos 97

Tengo que instalar una pulsación larga (UILongPressGestureRecognizer) en viewDidLoad: , pero sólo detectar el único toque de la primera.

Donde puedo configurar una pulsación larga para detectar todos los toque? (esto significa que el mapa listo cada vez que espera el usuario toque la pantalla para empujar un pin)

El viewDidLoad: método!

- (void)viewDidLoad {
    [super viewDidLoad];mapView.mapType = MKMapTypeStandard;

    UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressGesture:)];
    [self.mapView addGestureRecognizer:longPressGesture];
    [longPressGesture release];

    mapAnnotations = [[NSMutableArray alloc] init];
    MyLocation *location = [[MyLocation alloc] init];
    [mapAnnotations addObject:location];

    [self gotoLocation];
    [self.mapView addAnnotations:self.mapAnnotations];
}

y el handleLongPressGesture método de:

-(void)handleLongPressGesture:(UIGestureRecognizer*)sender {
    // This is important if you only want to receive one tap and hold event
    if (sender.state == UIGestureRecognizerStateEnded)
    {NSLog(@"Released!");
        [self.mapView removeGestureRecognizer:sender];
    }
    else
    {
        // Here we get the CGPoint for the touch and convert it to latitude and longitude coordinates to display on the map
        CGPoint point = [sender locationInView:self.mapView];
        CLLocationCoordinate2D locCoord = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];
        // Then all you have to do is create the annotation and add it to the map
        MyLocation *dropPin = [[MyLocation alloc] init];
        dropPin.latitude = [NSNumber numberWithDouble:locCoord.latitude];
        dropPin.longitude = [NSNumber numberWithDouble:locCoord.longitude];
//        [self.mapView addAnnotation:dropPin];
        [mapAnnotations addObject:dropPin];
        [dropPin release];
        NSLog(@"Hold!!");
        NSLog(@"Count: %d", [mapAnnotations count]);
    }   
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X