2010-06-20 17 views
15

Próbuję dowiedzieć się, jak umieścić adnotację na mapie w oparciu o miejsce, w którym użytkownik dotknie.Uzyskaj współrzędne punktu od mkmapview na iphone

Próbowałem sub-uznającej MKMapView i szukał touchesBegan na ogień, ale jak się okazuje, MKMapView nie używa standardowego dotyka metod.

Próbowałem również podkategorii UIView, dodając MKMapView jako dziecko, a następnie słuchając HitTest i touchesBegan. To działa nieco. jeśli mam moją mapę pełną wielkość UIView, a potem mieć coś takiego

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

i że działa, mój touchesBegan będą mogli dostać punkt za pomocą

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

ale wtedy mapa ma pewne zwariowane zachowanie, ponieważ nie będzie przewijać, i nie będzie się powiększał, chyba że klikniesz dwukrotnie, ale możesz pomniejszyć. i działa tylko wtedy, gdy zwrócę mapę jako widok. Jeśli nie mam metody testu trafień, mapa działa dobrze, ale oczywiście nie ma żadnych danych.

Czy zamierzam poprawić współrzędne? Proszę powiedz mi, że jest lepszy sposób. Wiem, jak dodawać adnotacje, po prostu nie mogę znaleźć żadnych przykładów dodawania adnotacji, gdzie i kiedy użytkownik dotknie mapy.

Odpowiedz

8

więc znalazłem sposób, aby to zrobić, w końcu. Jeśli utworzę widok i doda do niego obiekt mapy z tą samą ramką. następnie słuchać testu kolizji na tym widoku, mogę zadzwonić convertPoint: toCoordinateFromView: w punkcie dotykowym wysłał, i nadać mu mapę tak:

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

to dość szorstki jak jest i jak można przewijać mapę ciągle wywołuje test trafień, więc będziesz musiał sobie z tym poradzić, ale jest to początek, gdy koordynaty GPS nie dotykają mapy.

3

Trochę martwego wątku kopanie ale jak to jest top wynik w Google może warto go:

Można użyć naciśnij i przytrzymaj gest rozpoznawania w celu uzyskania współrzędnych i umieścić pinezkę na mapa. Wszystko jest wyjaśnione w freshmob

41

Można spróbować ten kod

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

wszystkiego najlepszego.

+0

wersja 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 
} 
Powiązane problemy