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的测试版上测试,问题不再出现了。
记录了我在这里看到的问题和解决方法。出现与切换图像和使用资产目录时完成的动画有关。
我找到了解决方案
/// 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
首先,我遇到了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的测试版上测试,问题不再出现了。
记录了我在这里看到的问题和解决方法。出现与切换图像和使用资产目录时完成的动画有关。
我找到了解决方案
/// 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