单击地图注释时的 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 Viewbody,你可以从它所代表的项目中传递你想要使用的任何参数,包括它是否被选中。

【讨论】:

以上是关于单击地图注释时的 SwiftUI 操作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 的新地图视图中制作可点击的图钉?

如何使用 MapKit (SwiftUI) 将工具提示添加到地图注释以在地图上显示位置名称

SwiftUI 地图显示注解

根据 MapKit 注释标注在视图中加载数据单击

单击打开 jQuery Mobile 面板小部件时的 Google 地图指针

鼠标悬停时的 SVG 地图工具提示,可单击