From 8ec74c101255df839d2f949b9fb3e9dd94b2b20b Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 16 May 2025 14:07:51 +0200 Subject: [PATCH] refactor(UIKit): add search sheet to uikit --- .../UserInterfaceState.xcuserstate | Bin 25382 -> 42006 bytes StepMap/ContentView.swift | 74 ++++-------------- StepMap/SearchItemView.swift | 12 +-- StepMap/SearchView.swift | 70 ++++++++--------- StepMap/UIKitMapView.swift | 34 +++++++- StepMap/ViewModel.swift | 6 +- 6 files changed, 92 insertions(+), 104 deletions(-) diff --git a/StepMap.xcodeproj/project.xcworkspace/xcuserdata/oliverhnat.xcuserdatad/UserInterfaceState.xcuserstate b/StepMap.xcodeproj/project.xcworkspace/xcuserdata/oliverhnat.xcuserdatad/UserInterfaceState.xcuserstate index 1a4daba38e613ecd7b3fd363a3cd96244d29c844..9964d7dd51e7be8a54c41bbd6d8db276b941552e 100644 GIT binary patch literal 42006 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 RM8vN;DDOA;^qYiR{|{u}u&V$7 delta 12497 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 CLLocationCoordinate2D? { let pointCount = route.polyline.pointCount if pointCount > 0 { diff --git a/StepMap/SearchItemView.swift b/StepMap/SearchItemView.swift index 5ad29c5..54d3d28 100644 --- a/StepMap/SearchItemView.swift +++ b/StepMap/SearchItemView.swift @@ -13,20 +13,20 @@ import SwiftUI struct SearchItemView: View { var location: MKMapItem @State var distance: CLLocationDistance? - @Binding var directions: [MKRoute] - @Binding var stepLength: Double? @Binding var showSteps: Bool @State var localDirections: [MKRoute] = [] - @Binding var destination: MKMapItem? + @ObservedObject var viewModel: ViewModel var body: some View { Button( action: { if localDirections == [] { + print("finding directions") findDirections() } - directions = localDirections + viewModel.directions = localDirections + print("Directions set") }, label: { HStack { @@ -86,7 +86,7 @@ struct SearchItemView: View { } func formatDistance(distance: CLLocationDistance) -> String { - let steps = distance / (stepLength ?? 1) + let steps = distance / (viewModel.stepLength ?? 1) if steps != 0 && showSteps { let formatter = NumberFormatter() formatter.maximumFractionDigits = 0 @@ -118,7 +118,7 @@ struct SearchItemView: View { } self.localDirections = response.routes self.distance = response.routes.first?.distance - self.destination = location + viewModel.destination = location } } } diff --git a/StepMap/SearchView.swift b/StepMap/SearchView.swift index f256478..c9c3f1c 100644 --- a/StepMap/SearchView.swift +++ b/StepMap/SearchView.swift @@ -11,56 +11,54 @@ import SwiftUI struct SearchView: View { @State private var query: String = "" @State private var locations: [MKMapItem] = [] - @Binding var directions: [MKRoute] - @Binding var stepLength: Double? @State var showSteps = true var locationManager: LocationManager - @Binding var destination: MKMapItem? + @ObservedObject var viewModel: ViewModel var body: some View { - VStack { - HStack { - Image(systemName: "magnifyingglass") - TextField("Search for any location", text: $query) - .autocorrectionDisabled() - .onChange(of: self.query) { - if query.count > 0 { - search(for: self.query) - } else { - self.locations = [] + ZStack { + Rectangle() + .fill(.thinMaterial) + .ignoresSafeArea() + VStack { + HStack { + Image(systemName: "magnifyingglass") + TextField("Search for any location", text: $query) + .autocorrectionDisabled() + .onChange(of: self.query) { + if query.count > 0 { + search(for: self.query) + } else { + self.locations = [] + } } - } // .onAppear { // // TODO: delete this, it's for debug only // search(for: self.query) // } - .overlay { - HStack { - Spacer() - Image(systemName: "multiply.circle.fill") - .foregroundStyle(.gray) - .onTapGesture { - query = "" - } + .overlay { + HStack { + Spacer() + Image(systemName: "multiply.circle.fill") + .foregroundStyle(.gray) + .onTapGesture { + query = "" + } + } } + } + .modifier(TextFieldGrayBackgroudColor()) + Spacer() + ScrollView { + ForEach(self.locations, id: \.identifier) { location in + SearchItemView(location: location, showSteps: $showSteps, viewModel: viewModel) } - } - .modifier(TextFieldGrayBackgroudColor()) - Spacer() - ScrollView { - ForEach(self.locations, id: \.identifier) { location in - SearchItemView( - location: location, directions: $directions, stepLength: $stepLength, - showSteps: $showSteps, destination: $destination) } } + .padding() + .interactiveDismissDisabled() + .ignoresSafeArea() } - .padding() - .interactiveDismissDisabled() - - .presentationDetents([.height(200), .large]) - .presentationBackground(.regularMaterial) - .presentationBackgroundInteraction(.enabled(upThrough: .large)) } func search(for text: String) { diff --git a/StepMap/UIKitMapView.swift b/StepMap/UIKitMapView.swift index 06a39e4..39979ff 100644 --- a/StepMap/UIKitMapView.swift +++ b/StepMap/UIKitMapView.swift @@ -11,6 +11,9 @@ import SwiftUI class UIKitMapView: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate { var locationManager: LocationManager + var viewModel: ViewModel + var directions: [MKRoute] = [] + var destination: MKMapItem? let mapView : MKMapView = { let map = MKMapView() map.showsUserTrackingButton = true @@ -18,8 +21,10 @@ class UIKitMapView: UIViewController, MKMapViewDelegate, CLLocationManagerDelega return map }() - init(locationManager: LocationManager) { + + init(locationManager: LocationManager, viewModel: ViewModel) { self.locationManager = locationManager + self.viewModel = viewModel super.init(nibName: nil, bundle: nil) } @@ -35,6 +40,10 @@ class UIKitMapView: UIViewController, MKMapViewDelegate, CLLocationManagerDelega setLocation() } + override func viewDidAppear(_ animated: Bool) { + setSearchView() + } + private func setLocation() { locationManager.requestAuthorization() locationManager.requestLocation() @@ -54,14 +63,35 @@ class UIKitMapView: UIViewController, MKMapViewDelegate, CLLocationManagerDelega mapView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true } + private func setSearchView() { + let searchViewConctroller = UIHostingController(rootView: SearchView(locationManager: locationManager, viewModel: viewModel)) + searchViewConctroller.view.backgroundColor = .clear + searchViewConctroller.modalPresentationStyle = .pageSheet + searchViewConctroller.edgesForExtendedLayout = [.top, .bottom, .left, .right] + if let sheet = searchViewConctroller.sheetPresentationController { + let smallDetentId = UISheetPresentationController.Detent.Identifier("small") + let smallDetent = UISheetPresentationController.Detent.custom(identifier: smallDetentId) { context in + return 200 + } + sheet.detents = [smallDetent, .large()] + sheet.largestUndimmedDetentIdentifier = .large + sheet.prefersScrollingExpandsWhenScrolledToEdge = false + sheet.prefersGrabberVisible = true + sheet.prefersEdgeAttachedInCompactHeight = true + sheet.widthFollowsPreferredContentSizeWhenEdgeAttached = true + } + self.present(searchViewConctroller, animated: true, completion: nil) + } + } struct MapView: UIViewControllerRepresentable { typealias UIViewControllerType = UIKitMapView @StateObject var locationManager: LocationManager + @ObservedObject var viewModel: ViewModel func makeUIViewController(context: Context) -> UIKitMapView { - return UIKitMapView(locationManager: locationManager) + return UIKitMapView(locationManager: locationManager, viewModel: viewModel) } func updateUIViewController(_ uiViewController: UIKitMapView, context: Context) { diff --git a/StepMap/ViewModel.swift b/StepMap/ViewModel.swift index e6d52ed..6bc8d86 100644 --- a/StepMap/ViewModel.swift +++ b/StepMap/ViewModel.swift @@ -6,10 +6,14 @@ // import Foundation +import MapKit class ViewModel: ObservableObject { @Published var test: String = UserDefaults.standard.string(forKey: "test") ?? "" - + @Published var directions: [MKRoute] = [] + @Published var stepLength: Double? + @Published var destination: MKMapItem? + func saveValue(_ value: String) { UserDefaults.standard.set(value, forKey: "test") test = value