问题描述
我正在使用自定义坐标设置MapView。到目前为止,这是我的代码
var coordModel: AirportModel?
struct MapView: View {
@Binding private var lat: Double
@Binding private var lon: Double
private let initialLatitudinalMetres: Double = coordModel?.airportLat ?? 0
private let initialLongitudinalMetres: Double = coordModel?.airportLong ?? 0
@State private var span: MKCoordinateSpan?
init(lat: Binding<Double>,lon: Binding<Double>) {
_lat = lat
_lon = lon
}
private var region: Binding<MKCoordinateRegion> {
Binding {
let centre = CLLocationCoordinate2D(latitude: lat,longitude: lon)
if let span = span {
return MKCoordinateRegion(center: centre,span: span)
} else {
return MKCoordinateRegion(center: centre,latitudinalMeters: initialLatitudinalMetres,longitudinalMeters: initialLongitudinalMetres)
}
} set: { region in
lat = region.center.latitude
lon = region.center.longitude
span = region.span
}
}
var body: some View {
Map(coordinateRegion: region)
}
}
在AirportModel中,有一段以Double格式解码的数据称为“纬度”和“经度”。我只是尝试将这些数据解码后传递给视图。这是我的视图正文:
var body: some View {
ScrollView{
MapView(lat: <#Binding<Double>#>,lon: <#Binding<Double>#>)
.frame(height: 250)
.edgesIgnoringSafeArea(/*@START_MENU_TOKEN@*/.all/*@END_MENU_TOKEN@*/)
}
我尝试将经纬度和纬度的coordModel?.latitude和coordModel?.longitude放入,以及在调用上方设置变量。我不太确定现在要去哪里。
注意:我正在解码一堆JSON数据,每个用户查询都会导致不同的经纬度拉动(超过10000个潜在响应)。再次感谢!
解决方法
使用ObservableObject
的模型:
import Combine
import MapKit
class MapModel: ObservableObject {
var region: MKCoordinateRegion = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: 48.687330584,longitude: 9.219832454),latitudinalMeters: 1000000,longitudinalMeters: 1000000
) {
willSet {
self.objectWillChange.send()
}
}
// MARK: - test code change center evey 10 seconds
init() {
self.timer = Timer.scheduledTimer(withTimeInterval: 10,repeats: true) { timer in
self.testIndex += 1
self.testIndex %= self.testCoordinates.count
let newCenter = self.testCoordinates[self.testIndex]
let oldSpan = self.region.span
DispatchQueue.main.async {
self.region = MKCoordinateRegion(center: newCenter,span: oldSpan)
}
}
}
let testCoordinates = [
CLLocationCoordinate2D(latitude: 48.687330584,// STR
CLLocationCoordinate2D(latitude: 41.297445,longitude: 2.0832941),// BCN
]
var testIndex: Int = 0
var timer: Timer? = nil
}
然后创建一个观察模型的视图
import SwiftUI
import MapKit
struct ContentView: View {
@ObservedObject private var mapModel = MapModel()
var body: some View {
Map(coordinateRegion: $mapModel.region)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
出于测试原因,我使用了一个计时器来模拟服务器中的更新数据。
如果需要注释,请将其添加到模型中,如果更改它们,请不要忘记self.objectWillChange.send()
。