Ищем лучший вариант для изменения mapType при выборе кнопки / сегментированного элемента управления. В настоящее время у меня есть приведенный ниже код, который в определенной степени работает, однако параметры выбора всегда меняются. Как я могу сохранить его согласованность как Стандартный, Спутниковый, Гибридный со Стандартным по умолчанию или любой другой вариант, выбранный пользователем последним?
ContentView.swift
struct ContentView: View {
@State private var selectedSegment = 0
@State var mapTypeItems: [String: MKMapType] = ["Hybrid": .hybrid, "Standard": .standard, "Satellite": .satellite]
var body: some View {
VStack {
Picker(selection: $selectedSegment, label: Text("")) {
ForEach(0..<mapTypeItems.count) { index in
Text(self.getMapType(index: index).key)
}
}.pickerStyle(SegmentedPickerStyle())
MapView(mapType: getMapType(index: self.selectedSegment).value)
.edgesIgnoringSafeArea(.all)
}
}
func getMapType(index: Int) -> (key: String, value: Binding<MKMapType>) {
let indexItem = mapTypeItems.index(mapTypeItems.startIndex, offsetBy: index)
return (mapTypeItems.keys[indexItem], $mapTypeItems.values[indexItem])
}
}
MapView.swift
struct MapView: UIViewRepresentable {
@Binding var mapType: MKMapType
let map = MKMapView(frame: .zero)
func makeCoordinator() -> MapViewCoordinator {
MapViewCoordinator(self)
}
func makeUIView(context: Context) -> MKMapView{
map.mapType = mapType
map.showsScale = true
map.showsTraffic = true
map.showsCompass = true
map.showsBuildings = true
let center = CLLocationCoordinate2D(latitude: -33.3208, longitude: 151.2336)
let region = MKCoordinateRegion(center: center, latitudinalMeters: 55000, longitudinalMeters: 55000)
map.setCameraBoundary(
MKMapView.CameraBoundary(coordinateRegion: region),
animated: true)
let zoomRange = MKMapView.CameraZoomRange(maxCenterCoordinateDistance: 200000)
map.setCameraZoomRange(zoomRange, animated: true)
map.region = region
map.register(
ArtworkView.self,
forAnnotationViewWithReuseIdentifier:
MKMapViewDefaultAnnotationViewReuseIdentifier)
loadInitialData()
map.addAnnotations(artworks)
return map
}
func updateUIView(_ view: MKMapView, context: Context){
view.delegate = context.coordinator
view.addAnnotations(artworks)
view.mapType = self.mapType
}
}
Спасибо за помощь