我正在没有使用 InterfaceBuilder
的情况下工作。
我有一个 MKAnnotationView
实例,并将 setDraggable
设置为 YES,
在我的 MKMapView
中,我的注释视图被显示出来,我可以拖放它。
当执行放置操作时,如何执行一个方法? 在这个方法中,我需要我的注释视图的新坐标。
我正在没有使用 InterfaceBuilder
的情况下工作。
我有一个 MKAnnotationView
实例,并将 setDraggable
设置为 YES,
在我的 MKMapView
中,我的注释视图被显示出来,我可以拖放它。
当执行放置操作时,如何执行一个方法? 在这个方法中,我需要我的注释视图的新坐标。
- (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的操作系统中运行,则需要更多手动工作来进行拖动。文档中的链接还指向了一个示例,如果需要,可以了解如何执行该操作。
您可能还想添加以下内容:
if (newState == MKAnnotationViewDragStateStarting) {
annotationView.dragState = MKAnnotationViewDragStateDragging;
}
else if (newState == MKAnnotationViewDragStateEnding || newState == MKAnnotationViewDragStateCanceling) {
annotationView.dragState = MKAnnotationViewDragStateNone;
}
由于MKAnnotationView不能准确地改变其拖动状态(这可能会导致在你停止拖动后,地图仍然跟随你的注释而移动),因此需要注意。
快速解决方案:
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)
}
}