Как получить текущий диапазон координат в 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
}
}