如何在iOS上管理MKAnnotationView的拖放?

12

我正在没有使用 InterfaceBuilder 的情况下工作。

我有一个 MKAnnotationView 实例,并将 setDraggable 设置为 YES, 在我的 MKMapView 中,我的注释视图被显示出来,我可以拖放它。

当执行放置操作时,如何执行一个方法? 在这个方法中,我需要我的注释视图的新坐标。

3个回答

37
如果您已经使用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);
    }
}

如需参考,请查看此处的文档中的“将您的注释视图标记为可拖动”部分。如果您的应用程序需要在早于4.x的操作系统中运行,则需要更多手动工作来进行拖动。文档中的链接还指向了一个示例,如果需要,可以了解如何执行该操作。


8

您可能还想添加以下内容:

if (newState == MKAnnotationViewDragStateStarting) {
    annotationView.dragState = MKAnnotationViewDragStateDragging;
}
else if (newState == MKAnnotationViewDragStateEnding || newState == MKAnnotationViewDragStateCanceling) {
    annotationView.dragState = MKAnnotationViewDragStateNone;
}

由于MKAnnotationView不能准确地改变其拖动状态(这可能会导致在你停止拖动后,地图仍然跟随你的注释而移动),因此需要注意。


2

快速解决方案:

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)           
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接