Получить координаты точки из 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
}