2010-06-20 18 views
15

Estoy tratando de encontrar la manera de poner una anotación en un mapa según el lugar donde toque el usuario.Obtenga las coordenadas de un punto de mkmapview en iphone

He tratado subclasificar la MKMapView y buscado la touchesBegan al fuego, pero como resulta que, MKMapView no utiliza el estándar toques métodos.

También he intentado subclasificar un UIView, agregando un MKMapView como un niño y luego escuchando HitTest y touchesBegan. Esto funciona de alguna manera. si tengo mi mapa del tamaño total de la UIView, y luego tener algo como esto

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    return map; 
} 

y que funciona, mi touchesBegan será capaz de obtener el punto usando

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    for (UITouch *touch in touches){ 
    CGPoint pt = [touch locationInView:map]; 
    CLLocationCoordinate2D coord= [map convertPoint:pt toCoordinateFromView:map]; 
    NSLog([NSString stringWithFormat:@"x=%f y=%f - lat=%f long = %f",pt.x,pt.y,coord.latitude,coord.longitude]); 
} 
} 

pero luego el mapa tiene un comportamiento alocado como que no se desplazará, y no se acercará a menos que se pulse dos veces, pero se puede alejar. y solo funciona si devuelvo el mapa como la vista. Si no tengo el método de prueba exitosa, el mapa funciona bien, pero obviamente no obtiene ningún dato.

¿Voy a equivocarme con las coordenadas? Por favor dime que hay una mejor manera. Sé cómo agregar anotaciones muy bien, simplemente no puedo encontrar ningún ejemplo de agregar una anotación donde y cuando un usuario toca el mapa.

Respuesta

8

así que encontré la manera de hacerlo, finalmente. Si creo una vista y le agrego un objeto de mapa con el mismo marco. Después escuche prueba de posicionamiento en ese punto de vista, puedo llamar convertPoint: toCoordinateFromView: en el punto de contacto enviado, y darle el mapa de este modo:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ 
    CLLocationCoordinate2D coord= [map convertPoint:point toCoordinateFromView:map]; 
    NSLog(@"lat %f",coord.latitude); 
    NSLog(@"long %f",coord.longitude); 

    ... add annotation ... 

    return [super hitTest:point withEvent:event]; 
} 

esto es bastante duro como es y como se desplaza el mapa se todavía llama constantemente a la prueba de aciertos, por lo que tendrá que manejar eso, pero es un comienzo para que las coordenadas gps toquen un mapa.

3

Un poco de hilo muertos cavando, pero ya que este es el primer resultado en Google que puede valer la pena:

Puede utilizar el toque y mantenga reconocedor gesto con el fin de obtener las coordenadas y colocar un alfiler en el mapa. Todo se explica en freshmob

41

Puede probar este código

- (void)viewDidLoad 
{ 
    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(foundTap:)]; 

    tapRecognizer.numberOfTapsRequired = 1; 

    tapRecognizer.numberOfTouchesRequired = 1; 

    [self.myMapView addGestureRecognizer:tapRecognizer]; 
} 


-(IBAction)foundTap:(UITapGestureRecognizer *)recognizer 
{ 
    CGPoint point = [recognizer locationInView:self.myMapView]; 

    CLLocationCoordinate2D tapPoint = [self.myMapView convertPoint:point toCoordinateFromView:self.view]; 

    MKPointAnnotation *point1 = [[MKPointAnnotation alloc] init]; 

    point1.coordinate = tapPoint; 

    [self.myMapView addAnnotation:point1]; 
} 

Todo lo mejor.

+0

versión Swift: http://stackoverflow.com/a/37860496/1151916 – Ramis

0

Swift 2,2

func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { 
    let point = gestureRecognizer.locationInView(mapView) 
    let tapPoint = mapView.convertPoint(point, toCoordinateFromView: view) 
    coordinateLabel.text = "\(tapPoint.latitude),\(tapPoint.longitude)" 

    return true 
} 
Cuestiones relacionadas