我在没有InterfaceBuilder
的情况下工作。
我在是上有MKAnnotationView
setDraggable
的实例,
在我的MKMapView
我的注释视图显示,我可以拖放它。
执行放置操作时如何执行方法? 在这个方法中,我需要我的注释视图的新协调。
答案 0 :(得分:34)
如果您使用setCoordinate方法正确设置了MKAnnotation对象,那么在didChangeDragState方法中,新坐标应该已经在注释对象中:
- (void)mapView:(MKMapView *)mapView
annotationView:(MKAnnotationView *)annotationView
didChangeDragState:(MKAnnotationViewDragState)newState
fromOldState:(MKAnnotationViewDragState)oldState
{
if (newState == MKAnnotationViewDragStateEnding)
{
CLLocationCoordinate2D droppedAt = annotationView.annotation.coordinate;
NSLog(@"dropped at %f,%f", droppedAt.latitude, droppedAt.longitude);
}
}
供参考,请参阅docs here中的“将注释视图标记为可拖动”部分。如果您的应用需要在早于4.x的操作系统中工作,则拖动需要更多的手动工作。文档中的链接还指出了在需要时如何执行此操作的示例。
答案 1 :(得分:7)
您可能还想添加以下内容:
if (newState == MKAnnotationViewDragStateStarting) {
annotationView.dragState = MKAnnotationViewDragStateDragging;
}
else if (newState == MKAnnotationViewDragStateEnding || newState == MKAnnotationViewDragStateCanceling) {
annotationView.dragState = MKAnnotationViewDragStateNone;
}
因为MKAnnotationView没有准确地改变其拖动状态(即使你停止拖动也可能使你的地图平移你的注释)
答案 2 :(得分:1)
快速解决方案:
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, didChange newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState)
{
if (newState == MKAnnotationViewDragState.ending)
{
let droppedAt = view.annotation?.coordinate
print("dropped at : ", droppedAt?.latitude ?? 0.0, droppedAt?.longitude ?? 0.0);
view.setDragState(.none, animated: true)
}
if (newState == .canceling )
{
view.setDragState(.none, animated: true)
}
}