iOS Mapbox在拖动注释时更新地图会将注释还原为原始坐标

iOS Mapbox在拖动注释时更新地图会将注释还原为原始坐标,ios,swift,annotations,mapbox,drag,Ios,Swift,Annotations,Mapbox,Drag,我尝试在拖动注释时更新一些地图组件,例如高亮显示特定的MGLPolygon,如果注释已在边缘附近拖动,则平移地图。对于这个问题,我将使用后者 我尝试了代码并添加了一些行。这是我更改的准确副本 导入映射框 //示例视图控制器 类ViewController:UIViewController、MGLMapViewDelegate{ var映射视图:MGLMapView! 重写func viewDidLoad(){ super.viewDidLoad() mapView=MGLMapView(帧:vi

我尝试在拖动注释时更新一些地图组件,例如高亮显示特定的
MGLPolygon
,如果注释已在边缘附近拖动,则平移地图。对于这个问题,我将使用后者

我尝试了代码并添加了一些行。这是我更改的准确副本

导入映射框
//示例视图控制器
类ViewController:UIViewController、MGLMapViewDelegate{
var映射视图:MGLMapView!
重写func viewDidLoad(){
super.viewDidLoad()
mapView=MGLMapView(帧:view.bounds)
mapView.autoresizingMask=[.flexibleWidth、.flexibleHeight]
mapView.styleURL=MGLStyle.streetstyleurl
mapView.tintColor=.darkGray
mapView.zoomLevel=1
mapView.delegate=self
view.addSubview(地图视图)
//为注释指定坐标。
设坐标=[
CLLocationCoordinate2D(纬度:0,经度:-70),
CLLocationCoordinate2D(纬度:0,经度:-35),
CLLocationCoordinate2D(纬度:0,经度:0),
CLLocationCoordinate2D(纬度:0,经度:35),
CLLocationCoordinate2D(纬度:0,经度:70)
]
//使用点注释填充阵列并将其添加到地图中。
var pointannotation=[MGLPointAnnotation]()
对于坐标中的坐标{
let point=MGLPointAnnotation()
点坐标=坐标
point.title=“要拖动此批注,请先按住。”
pointAnnotations.append(点)
}
mapView.addAnnotations(点批注)
}
//标记:-MGLMapViewDelegate方法
//此委托方法用于告诉地图加载特定批注的视图。若要加载静态MGLAnnotationImage,请使用“-mapView:imageForAnnotation:”。
func mapView(uMapView:MGLMapView,viewFor annotation:MGLAnnotation)->MGLAnnotationView{
//此示例仅涉及点注释。
guard注释是MGLPoint注释{
归零
}
//为获得更好的性能,请始终尝试重用现有批注。若要使用多个不同的批注视图,请更改每个视图的重用标识符。
如果让annotationView=mapView.dequeueReusableAnnotationView(带有标识符:“DragablePoint”){
返回注释视图
}否则{
设dav=DragableAnnotationView(重用标识符:“DragablePoint”,大小:50)
dav.mapView=mapView
返回dav
}
}
func地图视图(u地图视图:MGLMapView,注释CanShowCallout注释:MGLAnnotation)->Bool{
返回真值
}
}
//MGLAnnotationView子类
类DragableAnnotationView:MGLAnnotationView{
var映射视图:MGLMapView!
变量屏幕:CGRect!
var mapBounds:CGRect!
init(reuseIdentifier:String,size:CGFloat){
super.init(reuseIdentifier:reuseIdentifier)
//`IsDragable`是MGLAnnotationView的属性,默认情况下禁用。
isDraggable=true
//此属性可防止贴图倾斜时注释更改大小。
scalesWithViewingDistance=false
//开始设置视图。
frame=CGRect(x:0,y:0,宽度:大小,高度:大小)
背景颜色=.darkGray
//使用CALayer的角半径将此视图变成一个圆。
layer.cornerRadius=尺寸/2
layer.borderWidth=1
layer.borderColor=UIColor.white.cgColor
layer.shadowColor=UIColor.black.cgColor
layer.shadowOpacity=0.1
screen=UIScreen.main.bounds
mapBounds=CGRect(
x:screen.origin.x+20,
y:屏幕。原点。y+20,
宽度:screen.size.width-40,
高度:屏幕尺寸高度-40)
}
//斯威夫特强迫我们使用这两个起首字母。
重写初始化(帧:CGRect){
super.init(frame:frame)
}
必需的初始化?(编码器aDecoder:NSCoder){
fatalError(“初始化(编码者:)尚未实现”)
}
//注释拖动状态更改的自定义处理程序。
重写函数setDragState(dragState:MGLAnnotationViewDragState,动画:Bool){
super.setDragState(dragState,动画:动画)
开关磁阻状态{
案例.开始:
打印(“开始”,终止符:“”)
起动
案例。拖动:
让pointCoordinate=self.mapView.convert(中心,到坐标From:nil)
如果mapBounds.contains(中间){
DispatchQueue.main.async{
self.mapView.setCenter(点坐标,动画:true)
}
}
打印(“.”,终止符:“”)
案例。结束,。取消:
打印(“结束”)
EndDraging()
案例:无:
打破
@未知默认值:
fatalError(“未知拖动状态”)
}
}
//当用户与注释交互时,设置不透明度和比例更改的动画。
func StartDraging(){
UIView.animate(持续时间:0.3,延迟:0,使用SpringWithDamping:0.5,初始SpringVelocity:0,选项:[],动画:{
self.layer.opacity=0.8
self.transform=CGAffineTransform.identity.scaledBy(x:1.5,y:1.5)
},完成日期:无)
//初始化触觉反馈发生器,给用户一个轻重击。
如果可用(iOS 10.0,*){
让hapticFeedback=UIImpactFeedbackGenerator(样式:。灯光)
hapticFeedback.impactOccursed()
}
}
func endDragging(){
transform=CGAffineTransform.identity.scaledBy(x:1.5,y:1.5)
UIView.animate(持续时间:0.3,延迟:0,使用SpringWithDamping:0.5,初始SpringVelocity:0,选项:[],动画:{
self.layer.opacity=1
self.transform=CGAffineTransform.identity.scaledBy(x:1,y:1)
},完成日期:无)
//当用户删除注释时,给他们更多的触觉反馈。
如果可用(iOS 10.0,*){
让hapticFeedback=UIImpactFeedbackGenerator(样式:。灯光)
hapticFeedback.impactOccursed()
}
}
}
每次调用
self.mapView.setCenter(点坐标,动画:true)
时,注释