При разработке iOS работа с изображениями часто предполагает обработку ресурсов в среде Photos. Одной из распространенных задач является преобразование объекта PHAsset в UIImage. В этой статье мы рассмотрим несколько методов достижения такого преобразования в Swift, а также приведем примеры кода.
Метод 1: использование PHImageManager
import Photos
func convertPHAssetToUIImage(withAsset asset: PHAsset, completion: @escaping (UIImage?) -> Void) {
let imageManager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true
imageManager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: requestOptions) { (image, _) in
completion(image)
}
}
Метод 2: использование PHCachingImageManager
import Photos
func convertPHAssetToUIImage(withAsset asset: PHAsset, completion: @escaping (UIImage?) -> Void) {
let imageManager = PHCachingImageManager()
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true
imageManager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: requestOptions) { (image, _) in
completion(image)
}
}
Метод 3: использование UIImagePickerViewController
import PhotosUI
func convertPHAssetToUIImage(withAsset asset: PHAsset, completion: @escaping (UIImage?) -> Void) {
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true
PHImageManager.default().requestImageDataAndOrientation(for: asset, options: requestOptions) { (data, _, _, _) in
if let imageData = data {
completion(UIImage(data: imageData))
} else {
completion(nil)
}
}
}
Метод 4. Использование представления UIImageJPEEGRepresentation
import Photos
func convertPHAssetToUIImage(withAsset asset: PHAsset, completion: @escaping (UIImage?) -> Void) {
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true
PHImageManager.default().requestImage(for: asset, targetSize: CGSize(width: asset.pixelWidth, height: asset.pixelHeight), contentMode: .aspectFit, options: requestOptions) { (image, _) in
if let jpegData = image?.jpegData(compressionQuality: 1.0) {
completion(UIImage(data: jpegData))
} else {
completion(nil)
}
}
}
Метод 5. Использование API Live Photos
import PhotosUI
func convertPHAssetToUIImage(withAsset asset: PHAsset, completion: @escaping (UIImage?) -> Void) {
if #available(iOS 9.1, *) {
let requestOptions = PHLivePhotoRequestOptions()
requestOptions.isSynchronous = true
PHImageManager.default().requestLivePhoto(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: requestOptions) { (livePhoto, _) in
if let livePhoto = livePhoto {
PHLivePhotoView().frame = CGRect(x: 0, y: 0, width: livePhoto.size.width, height: livePhoto.size.height)
completion(livePhoto.image)
} else {
completion(nil)
}
}
} else {
// Handle iOS versions earlier than 9.1
completion(nil)
}
}
Преобразование PHAsset в UIImage — обычное требование при разработке для iOS, и наличие нескольких методов в вашем распоряжении дает вам гибкость в зависимости от вашего конкретного варианта использования. В этой статье мы рассмотрели пять различных методов и продемонстрировали примеры кода для каждого подхода. Включив эти методы в свои проекты, вы сможете легко работать с изображениями в среде Photos.