单击地图注释时的 SwiftUI 操作
Posted
技术标签:
【中文标题】单击地图注释时的 SwiftUI 操作【英文标题】:SwiftUI action when clicking on map annotation 【发布时间】:2020-05-28 13:02:35 【问题描述】:单击 MapView 中的特定注释时,我希望添加一个包含有关注释信息的叠加层。
我正在寻找的是能够更新一个变量,然后调用 updateUIView() 以便地图显示与单击的注释相对应的叠加层。
【问题讨论】:
看这里:***.com/a/63747726/1151916 【参考方案1】:你可以这样做:
let places: [Place] = [
.init(name: "One", coordinate: .init(latitude: 56.951924, longitude: 24.125584)),
.init(name: "Two", coordinate: .init(latitude: 56.967520, longitude: 24.105760)),
.init(name: "Five", coordinate: .init(latitude: 56.9539906, longitude: 24.13649290000000))
]
@State var coordinateRegion = MKCoordinateRegion(center: .init(latitude: 54.6872, longitude: 25.2797), latitudinalMeters: 2000000, longitudinalMeters: 2000000)
var body: some View
Map(coordinateRegion: $coordinateRegion, annotationItems: places) (place) in
MapAnnotation(coordinate: place.coordinate)
Button(action: print(place.name) , label:
Text(place.name)
)
【讨论】:
【参考方案2】:实现这一点的方法是跟踪所选项目:
@State private var results: [SearchResult] = []
@State private var selectedResult: UUID?
您的项目应该已经是Identifiable
,如下所示:
struct SearchResult: Identifiable
let id = UUID()
let mapItem: MKMapItem
然后,当您遍历地图注释时,您可以决定生成选定的或未选定的:
Map(coordinateRegion: $region, interactionModes: .all, showsUserLocation: true, userTrackingMode: $trackUser, annotationItems: results) result in
buildAnnotation(result, isSelected: result.id == selectedResult)
并且在构建注释时,添加轻击手势识别器以更改所选项目,并根据需要将地图居中:
private func buildAnnotation(_ result: SearchResult, isSelected: Bool) -> some MapAnnotationProtocol
MapAnnotation(coordinate: result.mapItem.placemark.coordinate, anchorPoint: CGPoint(x: 0.5, y: 1.0))
MyCustomView(isSelected: isSelected)
.onTapGesture
withAnimation
selectedResult = result.id
region.center = result.mapItem.placemark.coordinate
MyCustomView
只是一个普通的 SwiftUI View
和 body
,你可以从它所代表的项目中传递你想要使用的任何参数,包括它是否被选中。
【讨论】:
以上是关于单击地图注释时的 SwiftUI 操作的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 MapKit (SwiftUI) 将工具提示添加到地图注释以在地图上显示位置名称