我正在构建一个依赖MapKit的SwiftUI应用程序。
但是我遇到了一个自定义引脚标记渲染的问题。
每当我添加大头针时,它都会从图像的中心渲染,因此它不会正确地与当前位置对齐。
我试过添加偏移量,改变原点,但自定义引脚图像基本上超出了界限。
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let view = MKAnnotationView(annotation: annotation, reuseIdentifier: nil)
let size = CGSize(width: 35, height: 40)
UIGraphicsBeginImageContext(size)
UIImage(named: "customPin")?.draw(in: CGRect(origin: CGPoint(x: 0, y: 20), size: size))
//let context = UIGraphicsGetCurrentContext()!
//context.move(to: CGPoint(x:0, y: -200))
// This code didn't affect the rendering
view.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
view.canShowCallout = true
return view
}
基本上我认为正在发生的是,我正在应用的偏移正在移动图像,但CGRect的边界仍然在同一个位置。我不知道如何抵消两者
在Apple的文档:用自定义数据注释地图中,他们提供了以下示例代码:
private func setupSanFranciscoAnnotationView(for annotation: SanFranciscoAnnotation, on mapView: MKMapView) -> MKAnnotationView {
let reuseIdentifier = NSStringFromClass(SanFranciscoAnnotation.self)
let flagAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier, for: annotation)
flagAnnotationView.canShowCallout = true
// Provide the annotation view's image.
let image = #imageLiteral(resourceName: "flag")
flagAnnotationView.image = image
// Provide the left image icon for the annotation.
flagAnnotationView.leftCalloutAccessoryView = UIImageView(image: #imageLiteral(resourceName: "sf_icon"))
// Offset the flag annotation so that the flag pole rests on the map coordinate.
let offset = CGPoint(x: image.size.width / 2, y: -(image.size.height / 2) )
flagAnnotationView.centerOffset = offset
return flagAnnotationView
}
他们正在使用centerOffset
来重新定位图像/注释。你试过这个吗?当他们想让一个角与坐标对齐时,他们已经将图像向上和向右移动了,通常我只想让中下对齐,所以为x偏移量提供0。