【问题标题】:Why does my Polyline only draw a point and not draw a line?为什么我的折线只画点不画线?
【发布时间】:2019-12-12 01:18:03
【问题描述】:

我在我的 MapKit 地图上绘制折线时遇到问题,我应该尝试在用户要去的地方画一条线,问题是当我移动用户的位置时它只会在其中绘制一个点新位置但不跟踪完整行

我已经尝试用起点和起点画线,但它对我不起作用,假设如果用户走路他的位置会更新,他应该去画线

这是我的方法 didUpdateLocations:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        if let location = locations.last{
            self.currentLocation = location
            mapKit.centerCoordinate = location.coordinate
            //Validamos si el usuario quiere recordar su ruta
            if SettingsViewController.recordRutaOn{
             points.append(location)
             print("Estamos registrando la ruta del usuario")

            }

            //Prueba para pintar la ruta
            print((locations.last?.coordinate.latitude)!,(locations.last?.coordinate.longitude)!)
            var rutaPoly = CLLocationCoordinate2D(latitude: (locations.last?.coordinate.latitude)!, longitude: (locations.last?.coordinate.longitude)!)
            let polyline = MKPolyline(coordinates: &rutaPoly, count: locations.count)
            mapKit.add(polyline)
                if self.currentLocation == nil{
                self.currentAnnotation = MKPointAnnotation()
                self.currentAnnotation?.coordinate = location.coordinate
                self.mapKit.addAnnotation(self.currentAnnotation!)
            }
        }
    }

这是我的 renderFor 方法:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

        if overlay is MKPolyline{
            let polyline = overlay
            let polyLineRender = MKPolylineRenderer(overlay: polyline)
            polyLineRender.strokeColor = UIColor.blue
            polyLineRender.lineWidth = 2.0            

            return polyLineRender
        }
        return MKPolylineRenderer()
    }

我不明白我做错了什么,只画了一个点

【问题讨论】:

  • 斯威夫特 3? Xcode 8?真的吗?
  • 如果您不知道,如果您打算将此应用程序发送到 Apple App Store,您必须使用 Xcode 10.1 或更高版本。 Xcode 8 太过时了。是时候升级了。
  • @rmaddy 是的,我知道,我知道我应该使用新版本但这只是一个练习和我目前可以使用的 xcode

标签: ios swift3 mapkit xcode8


【解决方案1】:

您已将rutaPoly 定义为单个CLLocationCoordinate2D。因此,当您从中创建MKPolyline 时,只有一个坐标,因此渲染的折线将是一个点。更糟糕的是,您提供给 MKPolylinecount 参数与第一个参数无关,您可以通过这种方式获得一些未定义的行为。

您想保留一个坐标数组并将新坐标附加到该数组。比如:

var coordinates: [CLLocationCoordinate2D] = []
var currentPolyline: MKPolyline?

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let location = locations.last else { return }

    coordinates.append(location.coordinate)
    let polyline = MKPolyline(coordinates: coordinates, count: coordinates.count)
    mapView.addOverlay(polyline)
    if let currentPolyline = currentPolyline {
        mapView.removeOverlay(currentPolyline)
    }
    currentPolyline = polyline
}

或者,您也可以将每个新的位置更新添加为单独的折线:

var previousCoordinate: CLLocationCoordinate2D?

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let location = locations.last else { return }

    if let previousCoordinate = previousCoordinate {
        let coordinates = [previousCoordinate, location.coordinate]
        let polyline = MKPolyline(coordinates: coordinates, count: coordinates.count)
        mapView.addOverlay(polyline)
    }
    previousCoordinate = location.coordinate
}

但无论您做什么,请确保为 MKPolyline 初始化程序提供了一个 CLLocationCoordinate2D 及其各自的 count 数组。

【讨论】:

  • 你是对的,我做错了我应该创建折线的方式,我没有意识到我误用了坐标,非常感谢!
猜你喜欢
  • 2014-08-14
  • 2014-12-22
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 2023-01-08
  • 2019-12-06
相关资源
最近更新 更多