まえがき
PhotoPicker周りはiOS15まではUIKitを使って実装していましたが、
iOS16からSwiftUIでPhotoPickerが使えるようになるみたいなので、調べてみました。
使い方
PhotoPickerで選んだものがPhotosPickerItemとして渡ってくる。
PhotosPicker(selection: $photosModel.selectedPhoto, matching: .any(of: [.images])
,photoLibrary: .shared()) {
Image(systemName: "photo.fill")
}
)
enum ImageStateはロードするメディアの状態を管理するためのもの。
今回のケースでは PhotosPickerで渡してもらうのは .images 画像のみとなっています。
例えば、
iCloud上にあるものはダウンロードしないといけないときに loading
オフライン状態になっているとError に入るようになっています。
class PhotosPickerModel: ObservableObject {
@Published private(set) var imageState: ImageState = .empty
enum ImageState {
case empty
case loading(Progress)
case success(Image)
case failure(Error)
}
@Published var selectedPhoto: PhotosPickerItem? {
didSet{
if let selectedPhoto {
let progress = loadTransfereble(photo: selectedPhoto)
imageState = .loading(progress)
} else {
imageState = .empty
}
}
}
}
渡ってきたPhotosPickerItemをImageに変換する処理
struct MediaFile: Identifiable {
var id: String = UUID().uuidString
var image: Image
var data: Data
}
func loadTransfereble(photo: PhotosPickerItem) -> Progress {
photo.loadTransferable(type: Data.self) { result in
DispatchQueue.main.async {
switch result {
case .success(let data):
if let data, let image = UIImage(data: data){
self.loadedImages.append(.init(image: Image(uiImage: image), data: data))
}
case .failure(let failure):
print(failure)
}
}
}
}
あとがき
すごくかんたんに使えますね、
UIKitの出番がどんどん減っているのが嬉しいです。
参考
https://developer.apple.com/videos/play/wwdc2022/10023/
https://www.youtube.com/watch?v=YCZ2JxqKaiA