Как получить текущий диапазон координат в swiftUI?

Я работаю с картой набора карт, и мне нужно получить текущее значение модели диапазона координат. Чтобы при нажатии на точку карты сама карта не прыгала.

      import SwiftUI
import MapKit

struct MapScreenView: View {

    @StateObject private var vm = LocationsViewModel()

    var body: some View {

        ZStack {
            VStack {
                HStack {
                    ButtonFilterView()
                    Spacer()
                }
                Spacer()
            }.zIndex(1)
            Map(coordinateRegion:
                    $vm.mapRegion, annotationItems: vm.locations) {
                location in
                MapAnnotation(coordinate: location.coordinate) {
                    LocationMapAnnotationView()
                        .scaleEffect(vm.mapLocation == location ? 1.1 : 0.7)
                        .animation(.easeInOut, value: vm.mapLocation == location)
                        .onTapGesture {
                            vm.showTappedLocation(location: location)
                        }
                }
            }
            .edgesIgnoringSafeArea(.all)
        }
    }
}

struct MapScreenView_Previews: PreviewProvider {
    static var previews: some View {
        MapScreenView()
    }
}




      import Foundation
import MapKit
import SwiftUI

class LocationsViewModel: ObservableObject {

    @Published var locations: [Location] = LocationDataService.locations
    
    @Published var mapLocation: Location {
        didSet {
            updateMapRegion(location: mapLocation)
        }
    }

    @Published var mapRegion = MKCoordinateRegion()
    @Published var mapSpan = MKCoordinateSpan(latitudeDelta: 0.04, longitudeDelta: 0.04)
    
    init() {
        self.mapLocation = Location(name: "", coordinate: CLLocationCoordinate2D(latitude: 55.755864, longitude: 37.617698))
        updateMapRegion(location: Location(name: "", coordinate: CLLocationCoordinate2D(latitude: 55.755864, longitude: 37.617698)))
    }

    private func updateMapRegion(location: Location) {
        withAnimation(.easeInOut) {
            mapRegion = MKCoordinateRegion(
                center: location.coordinate,
                /// here i want get current span value
                span: location.name == "" ? MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1) : mapSpan
            )
        }
    }

    func showTappedLocation(location: Location) {
            mapLocation = location
    }
}

Когда я нажимаю на булавку карты, она возвращается к диапазону жесткого кода. Как я могу получить текущий диапазон? Я искал много решений, но не нашел подходящего

1 ответ

SwiftUIMapпринимает привязку к .

В вашем коде есть...

      Map(coordinateRegion: $vm.mapRegion, ...

Это двусторонняя связь между областью модели представления и представлением карты. При обновлении карты этот регион обновляется. При обновлении региона карта обновляется.

Таким образом, текущие значения вашей карты помогают внутри этогоmapRegion.

Глядя на документы дляMKCoordinateRegion https://developer.apple.com/documentation/mapkit/mkcoordinateregion/1452293-span

Он обладает свойством, котороеMKCoordinateSpan.

Итак, в модели представления... это текущийspanкарты.

Чтобы обновить свою функцию, вы можете сделать что-то вроде...

      private func updateMapRegion(location: Location) {
    withAnimation(.easeInOut) {
        mapRegion = MKCoordinateRegion(
            center: location.coordinate,
            /// here i want get current span value
            span: mapRegion.span
        )
    }
}

Сказав это, вы, кажется, создаете здесь совершенно новый регион. Не знаю, хорошая ли это идея. Вы можете просто обновить центр существующей области, не создавая совершенно новую.

      private func updateMapRegion(location: Location) {
    withAnimation(.easeInOut) {
        mapRegion.center = location.coordinate
    }
}
Другие вопросы по тегам