Xcode 15 Beta4中MapCircle不随中心点/半径更新问题求助
问题:MapCircle 无法随坐标或半径更新/缩放
使用Xcode 15.0 beta 4开发,定义了如下MapCoordinate结构体:
private struct MapCoordinate: Equatable { let location: Location let latitude: Double let longitude: Double var coordinate: CLLocationCoordinate2D { return CLLocationCoordinate2D(latitude: latitude, longitude: longitude) } init?(location: Location) { guard let latitude = location.latitude, let longitude = location.longitude else { return nil } self.location = location self.latitude = latitude self.longitude = longitude } }
声明了状态变量:
@State private var mapCoordinate: MapCoordinate? @State private var radius: CLLocationDistance
实现的mapView中,Annotation能随mapCoordinate变化正常动画,但MapCircle不会随mapCoordinate或radius的变化更新位置或缩放,需求是让用户选择自身位置周围的半径范围。
解决思路
- 补充动画触发的依赖值
当前仅给Map绑定了mapCoordinate作为动画触发条件,但radius变化也需要触发更新。修改animation修饰符,把两个状态变量都纳入依赖:
.mapStyle(.standard(elevation: .realistic)) .animation(.easeInOut, value: [mapCoordinate, radius])
- 确保
MapCoordinate的Equatable判断准确
自动合成的Equatable实现会依赖Location的相等性判断,如果Location的Equatable不是基于经纬度,会导致SwiftUI无法识别坐标变化。手动实现==方法,只判断经纬度:
private struct MapCoordinate: Equatable { // 原有代码不变 static func == (lhs: MapCoordinate, rhs: MapCoordinate) -> Bool { lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude } }
- 给MapCircle单独绑定动画
可以给MapCircle单独添加动画修饰符,确保它的更新不受父视图动画的影响:
MapCircle(center: mapCoordinate.coordinate, radius: radius) .foregroundStyle(.teal.opacity(circleOpacity)) .stroke(.teal, lineWidth: circleStrokeLineWidth) .animation(.easeInOut, value: mapCoordinate) .animation(.easeInOut, value: radius)
- 用
id强制刷新MapCircle(Beta版本临时方案)
Xcode 15 beta可能存在MapKit视图更新的bug,通过修改id强制SwiftUI重建MapCircle:
MapCircle(center: mapCoordinate.coordinate, radius: radius) .foregroundStyle(.teal.opacity(circleOpacity)) .stroke(.teal, lineWidth: circleStrokeLineWidth) .id("\(mapCoordinate?.latitude ?? 0)-\(mapCoordinate?.longitude ?? 0)-\(radius)")
内容的提问来源于stack exchange,提问作者ItayAmza
相关产品推荐
相关产品推荐

