Получить координаты точки из mkmapview на iphone

Я пытаюсь понять, как помещать аннотацию на карту, основанную на том, где пользователь прикасается.

Я попытался подклассифицировать MKMapView и искал touchesBegan для запуска, но, как выясняется, MKMapView не использует стандартные методы касаний.

Я также попробовал подклассификацию a UIView, добавив MKMapView в качестве дочернего элемента, а затем прослушивая HitTest и touchesBegan. Это работает несколько. если у меня есть моя карта полного размера UIView, то есть что-то вроде этого

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

и это работает, мой touchesBegan сможет получить точку с помощью

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

но тогда карта имеет какое-то безумное поведение, подобное тому, которое не будет прокручиваться, и оно не будет увеличиваться, если не будет двойным нажатием, но вы можете уменьшить масштаб. и он работает только в том случае, если я верну карту в качестве вида. Если у меня нет метода теста попадания, карта работает нормально, но, очевидно, не получает никаких данных.

Я собираюсь неправильно понять координаты? Скажите, что есть лучший способ. Я знаю, как добавлять аннотации просто отлично, я просто не могу найти примеров добавления аннотации, где и когда пользователь прикасается к карте.

Ответы

Ответ 1

поэтому я нашел способ сделать это, наконец. Если я создаю представление и добавлю к нему объект карты с тем же фреймом. затем прослушайте тест попадания на этом представлении, я могу вызвать convertPoint: toCoordinateFromView: в точке касания отправлено и придать ему карту следующим образом:

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

Это довольно грубо, как есть, и когда вы прокручиваете карту, она по-прежнему постоянно вызывает тест на удар, так что вам нужно будет справиться с этим, но его начать с того, чтобы получить координаты gps от касания карты.

Ответ 2

Вы можете попробовать этот код

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

Все самое лучшее.

Ответ 3

Немного мертвой нити, но, поскольку это лучший результат в Google, он может быть достоин:

Вы можете использовать распознаватель жестов нажатия и удерживания, чтобы получить координаты и сбросить булавку на карте. Все объяснено в freshmob

Ответ 4

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
}