高画質なくせにメモリ節約の点でも効果のある HEIC ぱいせんですが、古い端末だと対応していないので表示することはできません。
厳密には iOS11 以降の端末で iPhone7/7Plus 以上、iPad 第6世代以上は HEIC 対応していますが、それ以前の端末は対応していません。
iCloud 経由などで画像を共有している場合は、非対応端末でも表示する可能性があるので、その際の対応方法を記載していこうと思います。
開発環境(前提条件)
・Xcode11.6
・Swift5
判定方法
めっちゃシンプルコードなので、class 作ったり extension 作ったり適宜お使いくだせい。
1 2 3 4 5 |
import AVFoundation static func isSupportHEIC() -> Bool { return (CGImageDestinationCopyTypeIdentifiers() as NSArray).contains(AVFileType.heic) } |
CGImageDestinationCopyTypeIdentifiers はその端末でサポートしている画像ファイルの配列を返してくれるので、その中に AVFileType.heic があるかどうかで HEIC に対応しているか確認しています。
“public.heic” でも判定できますが、一応 AVFileType 経由で判定してます。
HEIC 非対応端末で表示する方法
対応しているかどうかを上記の .isSupportHEIC() で判定して、必要であれば画像を再生成しましょう。
画像複製するコードも載っけときます。
1 2 3 4 5 6 7 8 9 10 |
extension UIImage { func redraw() -> UIImage? { let canvas = CGSize(width: self.size.width, height: self.size.height) return UIGraphicsImageRenderer(size: canvas, format: imageRendererFormat).image { _ in draw(in: CGRect(origin: .zero, size: canvas)) } } } |
画像複製する処理の中に HEIC 判定を書いて、非対応なら生成して対応していたらそのまま UIImage を返すって感じでもいいと思いますが、個人的に extension の中に extension を使うのが好きじゃないので別々にしてます 三└(┐卍 ˘ω˘)卍
さいごに
こういう古い端末では使えません系って、サポート切りたくなります。笑
まぁサポートするんですけどねー
他にも方法あれば教えてください!
コメント