Какие форматы изображений не поддерживаются UIImage напрямую?

«Какие форматы изображений не поддерживаются UIImage напрямую?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

UIImage из UIKit поддерживает растровые форматы (PNG, JPEG, TIFF, BMP), но не поддерживает напрямую:

  1. Векторные форматы (SVG, PDF). Для их отображения требуются сторонние библиотеки (например, SVGKit, PDFKit) или конвертация в UIImage.
  2. Анимированные форматы (GIF, APNG). При инициализации UIImage(data:) данными GIF будет показан только первый кадр.

Почему так? UIImage предназначен для работы с растровыми данными. Векторные и анимированные форматы требуют отдельной логики рендеринга и управления кадрами.

Пример и решение для GIF:

// Проблема: UIImage не анимирует GIF
let gifData = try! Data(contentsOf: Bundle.main.url(forResource: "anim", withExtension: "gif")!)
let staticImage = UIImage(data: gifData) // Только первый кадр

// Решение: Использовать специализированную библиотеку
// Например, с SDWebImage:
// animatedImageView.sd_setImage(with: url)
// Или с FLAnimatedImage (для FLAnimatedImageView):
// let animatedImage = FLAnimatedImage(animatedGIFData: gifData)

Альтернативы:

  • Для SVG в SwiftUI можно использовать Image с рендерингом из Data (требуется iOS 13+).
  • Для анимаций также рассмотрите нативные форматы вроде последовательности изображений или Lottie (JSON-анимации).