iOS 14 MapKit选择标注图片的bug

iOS 14 MapKit selected annotation image bug

首先,我遇到了iOS14才出现的问题,我用旧版本没有这样的问题

当我从地图上的别针中选择时,我改变了别针的图像,并扔了一张橙色的图片。在执行此任务时,我在 iOS 14 台设备上看到我在应用程序中使用的一些资产。iOS。

首次出场:

pin被选中的时刻:

引脚选择后:

选择图钉时,资产没有正常出现,直接选择图钉。现在,出现了这样的情况。

我在地图上pin点击的情况下使用的代码如下

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    view.image = UIImage(named: "pin_selected")
}

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
    view.image = UIImage(named: "pin")
}

这是秒过去的情况,但是我该如何解决这个问题?

我也遇到了同样的问题,折腾了很久才知道是图片的问题。当注释在状态之间设置动画时,可能图像中的一些遗留元数据会导致问题。我所做的是从设计中再次导出注释图像并在项目中替换,这解决了问题。

运行也是这个问题。对我有用的修复方法是将图像放入 Sprite Atlas 中:select Xcode 中的资产库,按左下角的 + 按钮,select New Sprite Atlas,然后将资源库中的图片拖入Sprites文件夹中

对我来说,问题只发生在小的 PNG 图像上。 JPEG 或大型 PNG(我试过 256x256 并按比例缩小)似乎工作正常。但是我最终使用了上述解决方法,因为小 PNG 非常适合这些地图图钉图标。我测试的设备是 运行 iOS 14.0.1.

我也遇到了同样的问题,但是我在iOS14.3的测试版上测试,问题不再出现了。

记录了我在这里看到的问题和解决方法。出现与切换图像和使用资产目录时完成的动画有关。

https://github.com/abotkin/FB8708184

我找到了解决方案

/// Pin image
func pinImageView(pinImage: UIImage) -> UIImage?  {
    /// Create canvas
    let scale = UIScreen.main.scale
    UIGraphicsBeginImageContextWithOptions(CGSize(width: 40, height: 40), false, scale)
    let currentContext = UIGraphicsGetCurrentContext()!
    currentContext.saveGState()
        
    /// Add pin image
    let imageRect = CGRect(x: 0, y: 0, width: 40, height: 40)
    pinImage.draw(in: imageRect)

    /// Generate new image
    let img = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    return img
}


func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    view.image = pinImageView(pinImage: UIImage(named: "pin_selected"))
}

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
    view.image = pinImageView(pinImage: UIImage(named: "pin"))
}

从源图钉图片设置宽度和高度,在我的例子中图钉图片是 40x40