在SwiftUI / MapKit中正确显示自定义引脚的方法如下:
viewForAnnotation
,它会在地图上显示引脚时被调用。在这个方法中,你可以返回一个自定义的MKAnnotationView来代替默认的引脚视图。register(_:forAnnotationViewWithReuseIdentifier:)
方法来注册自定义引脚视图。下面是一个示例代码,演示了如何在SwiftUI / MapKit中正确显示自定义引脚:
import SwiftUI
import MapKit
struct CustomAnnotation: Identifiable, MKAnnotation {
var id = UUID()
var coordinate: CLLocationCoordinate2D
var title: String?
var subtitle: String?
}
struct MapView: UIViewRepresentable {
@State private var region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 37.331516, longitude: -122.030028), span: MKCoordinateSpan(latitudeDelta: 0.2, longitudeDelta: 0.2))
var annotations: [CustomAnnotation]
func makeUIView(context: Context) -> MKMapView {
let mapView = MKMapView()
mapView.delegate = context.coordinator
mapView.setRegion(region, animated: true)
return mapView
}
func updateUIView(_ view: MKMapView, context: Context) {
view.removeAnnotations(view.annotations)
view.addAnnotations(annotations)
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, MKMapViewDelegate {
var parent: MapView
init(_ parent: MapView) {
self.parent = parent
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
guard annotation is CustomAnnotation else {
return nil
}
let identifier = "CustomAnnotation"
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
if annotationView == nil {
annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
annotationView?.canShowCallout = true
} else {
annotationView?.annotation = annotation
}
return annotationView
}
}
}
struct ContentView: View {
var body: some View {
MapView(annotations: [
CustomAnnotation(coordinate: CLLocationCoordinate2D(latitude: 37.331516, longitude: -122.030028), title: "Apple Park", subtitle: "Cupertino, CA"),
CustomAnnotation(coordinate: CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194), title: "Golden Gate Bridge", subtitle: "San Francisco, CA")
])
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
在上面的示例代码中,我们首先创建了一个遵循MKAnnotation协议的CustomAnnotation结构体来表示自定义引脚。然后,我们创建了一个MapView结构体,它遵循UIViewRepresentable协议,并实现了MKMapViewDelegate协议中的方法来自定义引脚的外观和行为。最后,在ContentView中使用MapView来显示地图和自定义引脚。
这是一个简单的示例,你可以根据自己的需求进行修改和扩展。希望对你有帮助!
领取专属 10元无门槛券
手把手带您无忧上云