Ошибка изображения выбранной аннотации в iOS 14 MapKit

#swift #image #annotations #mapkit #ios14

#swift #изображение #аннотации #mapkit #ios14

Вопрос:

Прежде всего, я столкнулся с проблемой, которая появилась только с iOS 14. У меня нет такой проблемы со старыми версиями.

Я меняю изображение булавки, когда выбираю один из булавок на карте, и бросаю оранжевую картинку. При выполнении этого назначения я вижу некоторые ресурсы, которые я использую в приложении во время этого изменения на устройствах iOS 14.

Первое появление:

Перед

В момент выбора pin-кода:

Во время

После выбора pin-кода:

После

Когда выбран 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")
}
  

Это ситуация, которая проходит за считанные секунды, но как я могу решить эту проблему?

Ответ №1:

У меня была такая же проблема, и после долгих усилий я понял, что это была проблема с изображением. Вероятно, некоторые оставленные метаданные в изображении вызывают проблему, когда аннотация анимируется между состояниями. То, что я сделал, это то, что изображение для аннотации было снова экспортировано из designs и заменено в проекте, и это решило проблему.

Комментарии:

1. Я увеличил высоту одного из изображений на 1 в Adobe XD, и проблема была решена. Это смешно, но это было мое решение. Значки, которые я создал с нуля, также не работали, я предполагаю, что такая ошибка возникает при небольшом размере.

2. это случайное решение, не всегда работает. Я удалил все метаданные изображений, но по-прежнему не работает на iOS 14.2. пробовал также использовать ресурсы только в формате pdf или только в формате png для изображений аннотаций, безуспешно

Ответ №2:

Также столкнулся с этой проблемой. Исправление, которое сработало для меня, заключается в том, чтобы поместить изображения в атлас спрайтов: выберите библиотеку ресурсов в Xcode, нажмите кнопку в левом нижнем углу, выберите Новый атлас спрайтов, затем перетащите изображения из библиотеки ресурсов в папку спрайтов.

Для меня проблема возникала только с небольшими изображениями в формате PNG. JPEG или большие PNG (я попробовал 256×256 и уменьшил), похоже, работали нормально. Однако в итоге я использовал вышеуказанный обходной путь, поскольку небольшие PNG-файлы идеально подходят для этих значков значков на карте. На устройствах, которые я тестировал, была установлена iOS 14.0.1.

Ответ №3:

У меня такая же проблема, но я протестировал бета-версию iOS 14.3, и проблема больше не возникала.

Ответ №4:

Документированные проблемы, которые я видел здесь, с обходным путем. Появляется в связи с анимацией, выполняемой при переключении изображений и использовании каталога ресурсов.

https://github.com/abotkin/FB8708184

Ответ №5:

Я нашел решение

 /// 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"))
}
  

Установите ширину и высоту исходного изображения с выводом, в моем случае изображение с выводом 40×40