2013-05-18 2 views
3

Я создаю путь (MKPolyline) на основе позиции добавленных пользователем аннотаций. Я хочу разрешить пользователям изменять путь, перетаскивая контакты. В настоящее время я могу это сделать, но MKPolyline не обновляется до тех пор, пока булавка не будет сброшена.Получение координат MKAnnotation при перетаскивании

Я применил - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)annotationView didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState для MKAnnotationViewDragStateDragging, но он только предупреждает меня, что пользователь перетаскивает штырь и не замечает о новой позиции.

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

Любые идеи? Благодаря!

ответ

4

Создайте подкласс MKAnnotationView и используйте этот подкласс для аннотации, которую вы перетаскиваете. В рамках этого подкласса:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    CLLocationCoordinate2D location = [_mapView convertPoint:self.center toCoordinateFromView:self.superview]; 
} 

К сожалению, объект MKAnnotation, связанный с MKAnnotationView не обновляет его координаты, пока MKAnnotationView не отбрасывается. Таким образом, вы должны использовать положение самого MKAnnotationView и преобразовать его в действительную координату.

Это также требует ссылки на MKMapView, что добавлена ​​аннотация к (_mapView здесь), которую вы можете передать в представление при его создании.

Если вы установили centerOffset свойство пояснительном, вам также необходимо учитывать, что:

CLLocationCoordinate2D location = [_mapView convertPoint:CGPointMake(self.center.x - self.centerOffset.x, self.center.y - self.centerOffset.y) toCoordinateFromView:self.superview]; 
+0

Это хорошо работает - спасибо :) Я вижу проблему, хотя там, где ее касается .Moved: withEvent: постоянно не вызывается при первом перетаскивании, а иногда и после этого. Я не могу понять, что может быть причиной этого. Есть предположения? – StephenT

+0

Использование touchhesMoved будет работать большую часть времени, однако я заметил, что когда я перетаскиваю определенные части моего пользовательского булавки (особенно верхнюю часть), touchsMoved не вызывается. Я исправил это, переопределив свойство центра. В Swift это просто: 'override var center: CGPoint {didSet {// code here}}' – JYeh

1

Отказ от ответственности: Я работаю в Xamarin.iOS/MonoTouch, но это решение можно было бы применять то же самое в Objective-C, поскольку большинство рассмотренных вопросов одинаковы.

Я создал пользовательский аннотационный просмотр согласно предложению Аварио, но события touchhesMoved никогда не попадали. Вместо этого я переопределил свойство Center (setCenter) и смог таким образом изменить координаты.

Смежные вопросы