如何在SwiftUI Map()中显示方向

6

我正在使用SwiftUI 3和Xcode 13+中的Map功能。


import SwiftUI
import CoreLocation
import CoreLocationUI
import MapKit

Map(coordinateRegion: $mapViewModel.region,
                    interactionModes: [.all],
                    showsUserLocation: true,
                    userTrackingMode: .constant(.none),
                    annotationItems: annotations) { place in
                    MapAnnotation(coordinate: place.placemark.location!.coordinate) {
                        MapPinView()
                    }
                }
                    .tint(.blue)
                    .environmentObject(mapViewModel)
                    .edgesIgnoringSafeArea(.all)
                    .onAppear {
                        mapViewModel.checkLocationServicesIsEnabled()
                        
                    }

所以,我在使用Map(...)。

有没有展示两点之间路线的示例?

谢谢。

3个回答

2

1

从这个教程开始 https://www.youtube.com/watch?v=H6pmm62axCg

你可以在这里找到源代码:https://github.com/apatronl/YouTube/blob/main/Directions/Directions/ContentView.swift

以下是相关的代码片段:

let request = MKDirections.Request()
    request.source = MKMapItem(placemark: p1)
    request.destination = MKMapItem(placemark: p2)
    request.transportType = .automobile

    let directions = MKDirections(request: request)
    directions.calculate { response, error in
      guard let route = response?.routes.first else { return }
      mapView.addAnnotations([p1, p2])
      mapView.addOverlay(route.polyline)
      mapView.setVisibleMapRect(
        route.polyline.boundingMapRect,
        edgePadding: UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20),
        animated: true)
      self.directions = route.steps.map { $0.instructions }.filter { !$0.isEmpty }
    }

2
这不是使用 SwiftUI 的 Map() .. 我正在使用的是 https://developer.apple.com/documentation/mapkit/map - Hatim
您正在使用的地图是MapKit的一部分。您不能使用默认视图来呈现所需内容,您需要创建一个自定义视图。这就是在那个github文件中所做的。您还可以查看这个类似的教程 https://www.hackingwithswift.com/books/ios-swiftui/advanced-mkmapview-with-swiftui - Mircea Botez

0

关于MapKit for SwiftUI (iOS17)

如先前回复中提到的,苹果在Meet MapKit for SwiftUI WWDC23会议中提供了代码。 请注意,您仍然使用MKRoute,SwiftUI的新增是MapPolyline视图。这段代码只是一个示例,根据您的实现可以进行优化。我建议您观看该会议。

代码如下:

// example
extension CLLocationCoordinate2D {
    static var start = CLLocationCoordinate2D(latitude: 49.7071, longitude: 0.2064)
    static var end = CLLocationCoordinate2D(latitude: 49.734, longitude: 0.222)
}
...
struct ContentView: View {

    @State private var route: MKRoute?
    @State private var selectedResult: MKMapItem?

    var body: some View {
        Map(selection: $selectedResult) {

             // assuming you have a marker here
              Marker("End", coordinate: .end)

              if let route {
                MapPolyline(route)
                    .stroke(.blue, lineWidth: 5)
              }
        }
    }
    func getDirections() {
        route = nil
        guard let selectedResult else { return }
        let request = MKDirections.Request()
        request.source = MKMapItem(placemark: MKPlacemark(coordinate: .start))
        request.destination = selectedResult
        
        Task {
            let directions = MKDirections(request: request)
            let response = try? await directions.calculate()
            route = response?.routes.first
            print(route?.expectedTravelTime.formattedToString ?? "No route")
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接