feat(LocationView): show basic information about a selected location
This commit is contained in:
Binary file not shown.
36
StepMap/AnnotationView.swift
Normal file
36
StepMap/AnnotationView.swift
Normal 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))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,7 @@ class UIKitMapView: UIViewController, MKMapViewDelegate, CLLocationManagerDelega
|
||||
var detailsDisplayed = false
|
||||
private var cancellables = Set<AnyCancellable>()
|
||||
let searchViewConctroller: UIHostingController<SearchView>
|
||||
var annotationViewController: UIHostingController<AnnotationView>?
|
||||
let mapView : MKMapView = {
|
||||
let map = MKMapView()
|
||||
map.showsUserTrackingButton = true
|
||||
@@ -120,6 +121,38 @@ class UIKitMapView: UIViewController, MKMapViewDelegate, CLLocationManagerDelega
|
||||
|
||||
func mapView(_ mapView: MKMapView, didSelect annotation: any MKAnnotation) {
|
||||
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) {
|
||||
@@ -129,6 +162,11 @@ class UIKitMapView: UIViewController, MKMapViewDelegate, CLLocationManagerDelega
|
||||
func hideSearchView() {
|
||||
searchViewConctroller.dismiss(animated: true)
|
||||
}
|
||||
func hideAnnotationView() {
|
||||
if let avc = self.annotationViewController {
|
||||
avc.dismiss(animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
private func bindViewModel() {
|
||||
viewModel.$directions
|
||||
|
||||
Reference in New Issue
Block a user