我正在实施简单导航并显示用户位置我正在使用自定义 MKAnnotationView :
let reuseId = "userLocationPin"
userLocationViewAnnotation = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
if userLocationViewAnnotation == nil {
userLocationViewAnnotation = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
userLocationViewAnnotation!.canShowCallout = true
userLocationViewAnnotation!.centerOffset = CGPoint(x: 0.9, y: -2)
userLocationViewAnnotation!.image = UIImage(named: "User_location_red_moving_x1")
}
这段代码运行正常。接下来我需要添加精度圆。我是通过 MKCircle 叠加来添加它:
userLocationCircle = MKCircle(centerCoordinate: location.coordinate, radius: location.horizontalAccuracy)
map.addOverlay(userLocationCircle!)
问题是用户位置在内部通过MKMap更频繁地更新和动画,但是在用户位置更改后(在我的代码中)圈子正在更新,因此它从一个点跳到另一个点。
是否可以将此圈添加到MKAnnotationView,或者您是否有其他想法?
答案 0 :(得分:1)
解决方案1 (我以前做过)
不要将MKMapView.showsUserLocation
设为true。这意味着你不能再使用delgate的mapView:didUpdateUserLocation:
了。这意味着获取用户的位置不太方便。您必须使用Core Location。 (大量的教程)
然后你必须相应地设置地图的中心和跨度,但你自己。通过这样做,您可以为用户的位置添加所需的任何注释。只需回复mapView(_:viewForAnnotation:)
并返回您要显示的视图即可。
解决方案2:(我觉得有效,但我自己从未尝试过)
像以前一样使用MKMapView.showsUserLocation但在任何情况下都会回复mapView(_:viewForAnnotation:)
。调试它。在第一次调用此方法时,它将传递给标准用户注释。 (我只是不知道它的类型/类名。这是第一个。这就是为什么我要求你调试它。)
只是不返回nil但返回您想要显示的视图。
值得一试。如果它起作用,它比解决方案1更少的工作。
但是,解决方案1使您可以更灵活地完全控制当前在地图中显示的世界部分。