正确调整 MapKit 地图注释图钉的大小

Correctly resize MapKit map annotation pin

我有一张地图,其中添加了几个注释图钉。

我想实现的是,当其中一个引脚被敲击时,引脚变大。

我有以下代码片段

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView){
    if(view.image != nil){
        UIView.animate(withDuration: 0.1) {
            view.centerOffset = CGPoint(x: 10, y: -20)
            view.frame.size = CGSize(width: (view.image?.size.width)! * 2, height: (view.image?.size.height)! * 2);
            view.frame.offsetBy(dx: (view.image?.size.width)! * 2, dy: (view.image?.size.height)! * 2)
        }
    }
}

虽然这确实调整了图像的大小,但图像变得扭曲并且图钉的位置也移动了(因此图钉放置的实际位置不是正确的位置),我能理解为什么会发生这种情况,但是我不明白的是如何解决这个问题。

是否有推荐的调整地图图钉大小的方法?

这里有2个问题。虽然你说你确实理解它们发生的原因,但我会解释它们以确保我们在同一页面上并从它们转移到可能的解决方案。

  1. "While this does resize the image, the image becomes distorted"

发生这种情况的原因是您将注释视图的大小调整为图钉图像大小的两倍。这意味着图钉图像将被放大,因此看起来会变形。

您可以做的是: a) (更快的解决方案)最初使引脚变小。例如,将它们设为正常大小的 0.7 倍,当您需要放大它们时,只需将它们调整为正常大小即可。 b)(正确的解决方案)为这些图钉使用不同的图像,其高度和宽度是您目前使用的图像的两倍。这样你仍然可以拥有与现在相同大小的图钉,尽管你仍然必须按照我在 a) 点中描述的进行操作(也许最初尝试使用 0.5 比例?)。如果您目前使用的是 MKPinAnnotationView,则必须切换到带有自定义图像的自定义 MKAnnotationView

这样一来,您将得到一个最初缩小的图像,然后在放大时以全分辨率显示。可能会有一些图像失真,但与放大图像时可见的失真相比几乎看不出来。

  1. "the position of the pin moves (so the actual location the pin is placed at, is not the correct location)"

这纯粹是因为不正确centerOffsetcenterOffset 是从注释视图中心(以及您的图像,如果它占据了整个注释视图而没有任何边距)到图像上应该是 "pinned" 的点的偏移量地图。该 "pinned" 点将放置在图钉应该指向的地图上的位置正上方,并且在您放大或缩小时将保持在该点上方。 当您放大注释视图时,中心偏移量将发生变化 - 例如,如果注释视图变得两倍大,那么 centerOffset 也会加倍,等等。