iOS 14 MapKit选择注释图像错误

问题描述

首先,我遇到了iOS 14附带的问题。旧版本没有这样的问题。

当我从地图上的图钉中进行选择时,我更改了图钉的图像,并抛出了橙色图片。进行此分配时,我看到了在iOS 14设备上进行此更改期间在应用程序中使用的一些资产。

首次出现:

Before

选择图钉的时间:

During

选择图钉后:

After

选择图钉后,资产不会正常显示,则直接选择了图钉。现在,这种情况介入了。

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

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中:在Xcode中选择资产库,按左下方的+按钮,选择New Sprite Atlas,然后将资产库中的图像拖到Sprites文件夹中。

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

,

我遇到了同样的问题,但是我在iOS 14.3的Beta版上进行了测试,该问题不再发生。

,

我在此处看到的已记录问题以及解决方法。显示与切换图像和使用资产目录时完成的动画有关。

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