在MKMapView中自定义用户位置标记和自定义精度圆

时间:2015-11-09 12:45:54

标签: ios swift mkmapview mapkit

我正在实施简单导航并显示用户位置我正在使用自定义 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,或者您是否有其他想法?

1 个答案:

答案 0 :(得分:1)

解决方案1 ​​(我以前做过)

不要将MKMapView.showsUserLocation设为true。这意味着你不能再使用delgate的mapView:didUpdateUserLocation:了。这意味着获取用户的位置不太方便。您必须使用Core Location。 (大量的教程) 然后你必须相应地设置地图的中心和跨度,但你自己。通过这样做,您可以为用户的位置添加所需的任何注释。只需回复mapView(_:viewForAnnotation:)并返回您要显示的视图即可。

解决方案2:(我觉得有效,但我自己从未尝试过)

像以前一样使用MKMapView.showsUserLocation但在任何情况下都会回复mapView(_:viewForAnnotation:)。调试它。在第一次调用此方法时,它将传递给标准用户注释。 (我只是不知道它的类型/类名。这是第一个。这就是为什么我要求你调试它。) 只是不返回nil但返回您想要显示的视图。

值得一试。如果它起作用,它比解决方案1更少的工作。

但是,解决方案1使您可以更灵活地完全控制当前在地图中显示的世界部分。