2010-06-20 10 views
15

J'essaie de comprendre comment mettre une annotation sur une carte en fonction de l'endroit où l'utilisateur touche.Obtenez les coordonnées d'un point de mkmapview sur iphone

J'ai essayé sous-MKMapView et le classing cherché le touchesBegan à feu, mais il se trouve que, MKMapView ne pas utiliser les touches standards méthodes.

J'ai également essayé de sous-classer un UIView, en ajoutant un MKMapView comme un enfant, puis en écoutant HitTest et touchesBegan. Cela fonctionne un peu. si j'ai ma carte la superficie de la UIView, alors quelque chose comme ça

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

et qui fonctionne, mon touchesBegan sera en mesure d'obtenir le point à l'aide

- (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]); 
} 
} 

mais la carte a un comportement un peu fou comme s'il ne défilait pas, et il ne va pas zoomer à moins d'avoir tapé deux fois mais vous pouvez faire un zoom arrière. et cela ne fonctionne que si je retourne la carte comme vue. Si je n'ai pas la méthode de test de coup, la carte fonctionne bien mais n'obtient évidemment aucune donnée.

Est-ce que je vais mal coordonner les coordonnées? S'il vous plaît dites-moi il y a une meilleure façon. Je sais comment ajouter des annotations, je ne trouve aucun exemple d'ajout d'une annotation où et quand un utilisateur touche la carte.

Répondre

8

alors j'ai trouvé un moyen de le faire, enfin. Si je crée une vue et y ajoute un objet de carte avec le même cadre. puis écouter test de recherche sur ce point de vue, je peux appeler convertPoint: toCoordinateFromView: sur le point de contact envoyé, et lui donne la carte comme ceci:

- (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]; 
} 

c'est assez rude comme l'est et que vous faites défiler la carte, il appelle toujours constamment le test de hit, donc vous devrez gérer cela, mais c'est un début pour obtenir les coordonnées GPS de toucher une carte.

3

Un peu de fil mort creuser, mais comme cela est le résultat dans Google, il peut être la peine:

Vous pouvez utiliser le robinet et maintenez reconnaissance de geste afin d'obtenir les coordonnées et déposer une broche sur la carte. Tout est expliqué à freshmob

41

Vous pouvez essayer ce code

- (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]; 
} 

Tous les meilleurs.

+0

Version 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 
}