10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

まえがき

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

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?