无法移动Mapbox V10中的AnnotationView



我一直在使用Mapbox v6,但我收到Mapbox的邮件,要求升级到v10以获得最新的更新。

我的应用程序使用Mapbox来显示自定义地图和显示多个用户的实时位置。在V6中,我们实现了自定义注解,并从这个mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView?方法中获取自定义注解视图。然后我们改变annotationView.coordinate,它工作得很好,我们的地图能够显示每个用户的实时位置数据。

在新的v10 SDK,我试图显示PointAnnotation有固定的位置,无法改变。要更改PointAnnotation的位置,我们需要从pointAnnotationManager中删除该注释,然后添加带有更新位置的新注释,这看起来相当奇怪。

我还尝试使用V10的自定义视图,并添加了基于ViewAnnotationOptions的注释视图,我无法在我的地图上看到。

请检查我的代码在这里(我无法看到注释视图):

private func annotation(at location: CLLocation, forDevice device: String) -> UIView? {
guard let mapView = self.mapView else { return nil }

let options = ViewAnnotationOptions(
geometry: Point(location.coordinate),
width: 100,
height: 40,
associatedFeatureId: device,
allowOverlap: false,
anchor: .center
)

guard let userMarker = mapView.viewAnnotations.view(forFeatureId: device) {
let sampleView = createSampleView(withText: "Hello world!")
// Added annotation view when it does not exist
try? mapView.viewAnnotations.add(sampleView, options: options)
return sampleView
}
// Update Annotation's position if already added
try? mapView.viewAnnotations.update(userMarker, options: options)
return userMarker
}

在对上面的代码做了一些修改之后,可以在地图上显示注释视图但它会随机生成多个注释视图。

private func annotation(at location: CLLocation, forDevice device: String) -> UIView? {
guard let mapView = self.mapView else { return nil }

let options = ViewAnnotationOptions(
geometry: Point(location.coordinate),
width: 100,
height: 40,
associatedFeatureId: device,
allowOverlap: false,
anchor: .center
)

if let userMarker = mapView.viewAnnotations.view(forFeatureId: device) {
// Removed annotation if already exists
try? mapView.viewAnnotations.remove(userMarker)
}

// Created new annotation and added again to the map.
// This seems quite weird as we need to add/remove annotation views just to change location of any annotation.
let sampleView = createSampleView(withText: "Hello world!")
try? mapView.viewAnnotations.add(sampleView, options: options)
//try? mapView.viewAnnotations.update(userMarker, options: options)
return sampleView
}

我似乎很难理解为什么在更新的SDK中更改注释的位置如此困难,这应该是非常容易的。

请建议我一些最好的解决方案来更新注释视图在地图上的位置。我相信添加/删除多个注释将是一个昂贵的操作。

注意:我不是试图在地图上显示当前用户的位置,但需要在地图上显示其他用户的位置,这些注释的位置需要随着任何用户的移动而更新。

associatedFeatureId用于将视图注释连接到地图上的特定功能:

视图注释没有显式绑定到任何源,但ViewAnnotationOptions。associatedFeatureId可以用来绑定给定的视图注释与一些特性。标识符意味着视图注释的可见性将由给定特征的可见性驱动。

文档

为了能够更新没有关联特性id的视图注释,您需要维护device<->视图映射。

private var viewsForDevices = [String: UIView]()
private func addOrUpdateAnnotationView(at location: CLLocation, forDevice device: String) -> UIView? {
guard let mapView = self.mapView else { return nil }
// check if the view for the device already exists
if let viewAnnotation = viewsForDevices[device] {
let updateOptions = ViewAnnotationOptions(geometry: Point(location.coordinate)) // update just the location
try! mapView.viewAnnotations.update(viewAnnotation, options: updateOptions)
return viewAnnotation
} else {
// create an annotation view and add it to the map
let options = ViewAnnotationOptions(
geometry: Point(location.coordinate),
width: 100,
height: 40,
allowOverlap: false,
anchor: .center
)
let sampleView = createSampleView(withText: "Hello world!")
try! mapView.viewAnnotations.add(sampleView, options: options)
viewsForDevices[device] = view
return sampleView
}
}

相关内容

  • 没有找到相关文章

最新更新