我是iOS开发的新手,我需要在iOS地图中实现可拖动的注释。我的代码在下面给出。我做了什么我无法获得可拖动的注释任何人都可以帮助注释,之后我需要获取引脚指向的位置的地址
RegistrationViewController.swift
class RegistrationViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource,MKMapViewDelegate{
@IBOutlet weak var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
var centerLocation = CLLocationCoordinate2DMake(12.964370125970357, 77.59643554937497)
var mapspan = MKCoordinateSpanMake(0.01, 0.01)
var mapregion = MKCoordinateRegionMake(centerLocation, mapspan)
self.mapView.setRegion(mapregion, animated: true)
let pin = pinAnnotation(title:"hello",subtitle:"how are you",coordinate:centerLocation)
mapView.addAnnotation(pin)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
if annotation is MKPointAnnotation {
let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin")
pinAnnotationView.pinColor = .purple
pinAnnotationView.isDraggable = true
pinAnnotationView.canShowCallout = true
pinAnnotationView.animatesDrop = true
return pinAnnotationView
}
return nil
}
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, didChange newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {
switch newState {
case .starting:
view.dragState = .dragging
case .ending, .canceling:
view.dragState = .none
default: break
}
}
pinAnnotation.swift
import MapKit
class pinAnnotation:NSObject,MKAnnotation {
var title:String?
var subtitle: String?
var coordinate: CLLocationCoordinate2D
init(title:String,subtitle:String,coordinate:CLLocationCoordinate2D) {
self.title = title
self.subtitle = subtitle
self.coordinate = coordinate
}
}
答案 0 :(得分:2)
您可以通过将isDraggable
属性设置为true来完成第一步。
现在,您只需要在用户停止拖动并删除注释时进行处理,请参阅:
how to manage drag and drop for MKAnnotationView on IOS
此外,你的pinAnnotation应该有一个可设置的坐标。
将注释视图标记为可拖动注释视图 内置拖动支持,这使得拖动非常容易 地图周围的注释并确保注释数据 相应更新。实现对拖动的最小支持:
在注释对象中,实现setCoordinate:方法 允许地图视图更新注释的坐标点。什么时候 创建注释视图,将其draggable属性设置为YES。什么时候 用户触摸并保持可拖动的注释视图,即地图视图 开始拖动操作。随着拖动操作的进行, 地图视图调用 mapView:annotationView:didChangeDragState:fromOldState:其方法 委托通知它视图拖动状态的变化。您 可以使用此方法来影响或响应拖动操作。
要在拖动操作期间为视图设置动画,请实现自定义 注释视图中的dragState方法。作为地图视图处理 拖动相关的触摸事件,它更新了dragState属性 受影响的注释视图。实现自定义dragState方法给出 你有机会拦截这些变化并执行额外的更改 动作,例如动画视图的外观。例如, 当拖动时,MKPinAnnotationView类会将引脚从地图上抬起 操作开始并在结束时将引脚向下放回地图上。
您缺少mapView:annotationView:didChangeDragState:fromOldState:
方法
答案 1 :(得分:2)
在您的情况下,annotation
不是MKPointAnnotation
类型。这就是为什么它没有进入if annotation is MKPointAnnotation {
状态。
应该是这样的:
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is pinAnnotation {
let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin")
pinAnnotationView.pinTintColor = .purple
pinAnnotationView.isDraggable = true
pinAnnotationView.canShowCallout = true
pinAnnotationView.animatesDrop = true
return pinAnnotationView
}
return nil
}
因为annotation
是pinAnnotation
类型。
我在代码中看不到mapView.delegate = self
。但是如果你通过故事板分配它,那就好了,否则用viewDidLoad
方法添加它。
您的完整代码将是:
import UIKit
import MapKit
class ViewController: UIViewController,MKMapViewDelegate{
@IBOutlet weak var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
let centerLocation = CLLocationCoordinate2D(latitude: 12.964370125970357, longitude: 77.59643554937497)
let mapspan = MKCoordinateSpanMake(0.01, 0.01)
let mapregion = MKCoordinateRegionMake(centerLocation, mapspan)
self.mapView.setRegion(mapregion, animated: true)
let pin = pinAnnotation(title:"hello",subtitle:"how are you",coordinate:centerLocation)
mapView.addAnnotation(pin)
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is pinAnnotation {
let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin")
pinAnnotationView.pinTintColor = .purple
pinAnnotationView.isDraggable = true
pinAnnotationView.canShowCallout = true
pinAnnotationView.animatesDrop = true
return pinAnnotationView
}
return nil
}
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, didChange newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {
switch newState {
case .starting:
view.dragState = .dragging
case .ending, .canceling:
view.dragState = .none
default: break
}
}
}
修改强>
您可以使用view.annotation?.coordinate
检查以下代码:
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, didChange newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {
switch newState {
case .starting:
view.dragState = .dragging
case .ending, .canceling:
//New cordinates
print(view.annotation?.coordinate)
view.dragState = .none
default: break
}
}