From 171e1813872512c80672c88909ee1a670ddd9597 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 16 May 2025 14:52:52 +0200 Subject: [PATCH] refactor(route): show route in UIKit map when searched --- .../UserInterfaceState.xcuserstate | Bin 42006 -> 42734 bytes StepMap/ContentView.swift | 15 ++---- StepMap/SearchView.swift | 2 + StepMap/UIKitMapView.swift | 43 +++++++++++++++++- StepMap/Utils.swift | 6 +-- 5 files changed, 49 insertions(+), 17 deletions(-) diff --git a/StepMap.xcodeproj/project.xcworkspace/xcuserdata/oliverhnat.xcuserdatad/UserInterfaceState.xcuserstate b/StepMap.xcodeproj/project.xcworkspace/xcuserdata/oliverhnat.xcuserdatad/UserInterfaceState.xcuserstate index 9964d7dd51e7be8a54c41bbd6d8db276b941552e..dd5d1595431348ca5fe0b6e60b4b21d41d5fc08d 100644 GIT binary patch delta 19079 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

SR6JHZRs1@p_ZX)!5o5-UnKx$tn496U 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 Q(EVLLv-^9`e%glr1Ka~saR2}S delta 19212 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 RUBBgHKD|Ks^lRMx{|7b0m81Xw diff --git a/StepMap/ContentView.swift b/StepMap/ContentView.swift index 5869eba..80a01c4 100644 --- a/StepMap/ContentView.swift +++ b/StepMap/ContentView.swift @@ -15,7 +15,7 @@ struct ContentView: View { @StateObject var locationManager = LocationManager() @StateObject var healthKitManager = HealthKitManager() - + // TODO: create a map // Add navigation to the map // after you click the navigation button, show the start and end place on the map with a tag or whatever it's called @@ -28,22 +28,13 @@ struct ContentView: View { // Add favorite locations - like home, work, etc (probably should be stored in core data tho:/) // FIX: search is bad lol - + // How to speed up? // calculate only the distance between the start and end instead of getting directions for everything // if user clicks on the place, display better view and then calculate route there var body: some View { MapView(locationManager: locationManager, viewModel: viewModel) - // Map(position: $position) { - // UserAnnotation() - // ForEach(0..() let mapView : MKMapView = { let map = MKMapView() map.showsUserTrackingButton = true @@ -34,6 +36,7 @@ class UIKitMapView: UIViewController, MKMapViewDelegate, CLLocationManagerDelega override func viewDidLoad() { super.viewDidLoad() + bindViewModel() mapView.delegate = self setMapConstraints() @@ -83,6 +86,42 @@ class UIKitMapView: UIViewController, MKMapViewDelegate, CLLocationManagerDelega self.present(searchViewConctroller, animated: true, completion: nil) } + private func refreshRoute() { + DispatchQueue.main.async { + for route in self.oldDirections { + self.mapView.removeOverlay(route.polyline) + } + self.oldDirections = self.viewModel.directions + for route in self.viewModel.directions { + self.mapView.addOverlay(route.polyline, level: .aboveRoads) + } + + if let destination = self.oldDestination { + self.mapView.removeAnnotation(destination) + } + if let destination = self.viewModel.destination { + self.oldDestination = MKMapItemAnnotation(mapItem: destination) + self.mapView.addAnnotation(self.oldDestination!) + } + } + } + + func mapView(_ mapView: MKMapView, rendererFor overlay: any MKOverlay) -> MKOverlayRenderer { + let renderer = MKGradientPolylineRenderer(overlay: overlay) + renderer.setColors(Defaults.routeColor, locations: []) + renderer.lineCap = .round + renderer.lineWidth = Defaults.routeWidth + return renderer + } + + private func bindViewModel() { + viewModel.$directions + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.refreshRoute() + } + .store(in: &cancellables) + } } struct MapView: UIViewControllerRepresentable { diff --git a/StepMap/Utils.swift b/StepMap/Utils.swift index 07bc878..6f480ab 100644 --- a/StepMap/Utils.swift +++ b/StepMap/Utils.swift @@ -10,10 +10,10 @@ import MapKit import SwiftUI struct Defaults { - static let routeColor: [Color] = [ + static let routeColor: [UIColor] = [ .blue, - .red, - .yellow, +// .red, +// .yellow, ] static let routeWidth: CGFloat = 8