2010-10-18 6 views

Respuesta

190

Puede utilizar un UILongPressGestureRecognizer para esto. Dondequiera que se crea o inicializar el MapView, conecte primero el reconocedor a ella:

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

A continuación, en el controlador gesto:

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

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

    YourMKAnnotationClass *annot = [[YourMKAnnotationClass alloc] init]; 
    annot.coordinate = touchMapCoordinate; 
    [self.mapView addAnnotation:annot]; 
    [annot release]; 
} 

YourMKAnnotationClass es una clase que defina que cumpla con el protocolo MKAnnotation. Si su aplicación solo se ejecutará en iOS 4.0 o posterior, puede usar la clase predefinida MKPointAnnotation en su lugar.

Para obtener ejemplos de cómo crear su propia clase MKAnnotation, consulte las aplicaciones de muestra WeatherMap y MapCallouts.

+0

Gracias, que está funcionando –

+6

respuesta impresionante, gracias. Personalmente volteé el enunciado if a '==' para que vuelva si * no es * 'UIGestureRecognizerStateBegan'. Al hacer esto, soltaré el pin después del tiempo especificado, incluso si el usuario todavía tiene el mapa que era deseable para mí (y cómo lo hace la aplicación oficial de Maps). –

+0

Me gustaría decir que implementé su respuesta en mi proyecto y funcionó a las mil maravillas. Gracias por tu excelente respuesta. – DoubleDunk

32

Gracias a Anna para proporcionar una gran respuesta tan! Aquí hay una versión de Swift si alguien está interesado (la respuesta se ha actualizado a la sintaxis de Swift 3.0).

Creación UILongPressGestureRecognizer:

let longPressRecogniser = UILongPressGestureRecognizer(target: self, action: #selector(MapViewController.handleLongPress(_:))) 
longPressRecogniser.minimumPressDuration = 1.0 
mapView.addGestureRecognizer(longPressRecogniser) 

Manejo del gesto:

func handleLongPress(_ gestureRecognizer : UIGestureRecognizer){ 
    if gestureRecognizer.state != .began { return } 

    let touchPoint = gestureRecognizer.location(in: mapView) 
    let touchMapCoordinate = mapView.convert(touchPoint, toCoordinateFrom: mapView) 

    let album = Album(coordinate: touchMapCoordinate, context: sharedContext) 

    mapView.addAnnotation(album) 
} 
+0

Wow ... No me di cuenta de esto y pasé mucho tiempo convirtiéndolo. –

+2

Es posible utilizar _ ** dejar que longPressRecogniser = UILongPressGestureRecognizer (objetivo: uno mismo, la acción: "handleLongPress:") ** _ –

+0

@Dx_ sí se puede, porque no se está modificando el reconocedor. Las propiedades en el reconocedor están siendo modificadas. – 3366784

Cuestiones relacionadas