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

时间:2010-10-22 16:12:05

标签: iphone drag-and-drop ios mkmapview

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

我在上有MKAnnotationView setDraggable的实例, 在我的MKMapView我的注释视图显示,我可以拖放它。

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

3 个答案:

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