feat(LocationView): show basic information about a selected location

This commit is contained in:
Oliver
2025-05-16 17:25:47 +02:00
parent bf7175bdd6
commit a64ef8d469
3 changed files with 74 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
//
// AnnotationView.swift
// StepMap
//
// Created by Oliver Hnat on 16/05/2025.
//
import SwiftUI
import MapKit
struct AnnotationView: View {
var pm: CLPlacemark
var body: some View {
ZStack {
Rectangle()
.fill(.thinMaterial)
.ignoresSafeArea()
VStack {
Text(pm.locality ?? "")
Text(pm.name ?? "")
Text("Name: \(pm.name ?? "")")
Text("Street: \(pm.thoroughfare ?? "")")
Text("City: \(pm.locality ?? "")")
Text("Postal Code: \(pm.postalCode ?? "")")
Text("Country: \(pm.country ?? "")")
ForEach(pm.areasOfInterest ?? [], id: \.self) { area in
Text("Area: \(area)")
}
if let coordinate = pm.location?.coordinate {
let mkPlacemark = MKPlacemark(coordinate: coordinate)
Image(systemName: Defaults.getIconFor(pointOfInterest: MKMapItem(placemark: mkPlacemark).pointOfInterestCategory))
}
}
}
}
}

View File

@@ -18,6 +18,7 @@ class UIKitMapView: UIViewController, MKMapViewDelegate, CLLocationManagerDelega
var detailsDisplayed = false var detailsDisplayed = false
private var cancellables = Set<AnyCancellable>() private var cancellables = Set<AnyCancellable>()
let searchViewConctroller: UIHostingController<SearchView> let searchViewConctroller: UIHostingController<SearchView>
var annotationViewController: UIHostingController<AnnotationView>?
let mapView : MKMapView = { let mapView : MKMapView = {
let map = MKMapView() let map = MKMapView()
map.showsUserTrackingButton = true map.showsUserTrackingButton = true
@@ -120,6 +121,38 @@ class UIKitMapView: UIViewController, MKMapViewDelegate, CLLocationManagerDelega
func mapView(_ mapView: MKMapView, didSelect annotation: any MKAnnotation) { func mapView(_ mapView: MKMapView, didSelect annotation: any MKAnnotation) {
hideSearchView() hideSearchView()
hideAnnotationView()
showAnnotation(annotation: annotation)
}
func showAnnotation(annotation: MKAnnotation) {
let location = CLLocation(latitude: annotation.coordinate.latitude,
longitude: annotation.coordinate.longitude)
CLGeocoder().reverseGeocodeLocation(location) { placemarks, error in
guard let placemark = placemarks?.first, error == nil else { return }
print(placemark)
self.annotationViewController = UIHostingController(rootView: AnnotationView(pm: placemark))
if let avc = self.annotationViewController {
avc.view.backgroundColor = .clear
avc.modalPresentationStyle = .pageSheet
avc.edgesForExtendedLayout = [.top, .bottom, .left, .right]
if let sheet = avc.sheetPresentationController {
let smallDetentId = UISheetPresentationController.Detent.Identifier("small")
let smallDetent = UISheetPresentationController.Detent.custom(identifier: smallDetentId) { context in
return 350
}
sheet.detents = [smallDetent, .large()]
sheet.largestUndimmedDetentIdentifier = .large
sheet.prefersScrollingExpandsWhenScrolledToEdge = false
sheet.prefersGrabberVisible = true
sheet.prefersEdgeAttachedInCompactHeight = true
sheet.widthFollowsPreferredContentSizeWhenEdgeAttached = true
}
self.present(avc, animated: true, completion: nil)
}
}
} }
func mapView(_ mapView: MKMapView, didDeselect annotation: any MKAnnotation) { func mapView(_ mapView: MKMapView, didDeselect annotation: any MKAnnotation) {
@@ -129,6 +162,11 @@ class UIKitMapView: UIViewController, MKMapViewDelegate, CLLocationManagerDelega
func hideSearchView() { func hideSearchView() {
searchViewConctroller.dismiss(animated: true) searchViewConctroller.dismiss(animated: true)
} }
func hideAnnotationView() {
if let avc = self.annotationViewController {
avc.dismiss(animated: true)
}
}
private func bindViewModel() { private func bindViewModel() {
viewModel.$directions viewModel.$directions