【发布时间】:2023-02-01 20:47:24
【问题描述】:
我正在尝试构建一个小型地图应用程序,用户的位置一直在变化。总的来说,我一直都在获取经纬度更新。我需要显示它们并用滑动动画显示变化,类似于 Apple FindMyFriend,当它们在实时移动时滑过地图。
这是我的观点:
struct ContentView: View {
@StateObject var request = Calls()
@State private var mapRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 56.946285, longitude: 24.105078), span: MKCoordinateSpan(latitudeDelta: 0.02, longitudeDelta: 0.02))
var body: some View {
Map(coordinateRegion: $mapRegion, annotationItems: $request.users){ $user in
withAnimation(.linear(duration: 2.0)) {
MapAnnotation(coordinate: CLLocationCoordinate2D(latitude: user.latitude, longitude: user.longitude)){
Circle()
}
}
}
}
}
在视图模型中调用函数,改变用户位置,响应只是来自 API 的传入字符串:
func collectUsers(_ response: String){
if users.count != 0{
var data = response.components(separatedBy: "\n")
data.removeLast()
let updates = self.users.map{ user -> User in
let newData = updateUserLocation(user: user, input: data)
return User(id: user.id, name: user.name, image: user.image, latitude: Double(newData[1])!, longitude: Double(newData[2])!)
}
DispatchQueue.main.async {
self.users = updates
}
}else{
var userData = response.components(separatedBy: ";")
userData.removeLast()
let users = userData.compactMap { userString -> User? in
let userProperties = userString.components(separatedBy: ",")
var idPart = userProperties[0].components(separatedBy: " ")
if idPart.count == 2{
idPart.removeFirst()
}
guard userProperties.count == 5 else { return nil }
guard let id = Int(idPart[0]),
let latitude = Double(userProperties[3]),
let longitude = Double(userProperties[4]) else { return nil }
return User(id: id, name: userProperties[1], image: userProperties[2], latitude: latitude, longitude: longitude)
}
DispatchQueue.main.async {
self.users = users
}
}
}
当然还有我的@Published:
class Calls: ObservableObject{
@Published var users = [User]()
当我使用 MapMarker 而不是 MapAnnotation 时,错误并不明显。我会使用标记,但我需要地图中的每个用户视图都不同。
【问题讨论】: