チュートリアルのイメージギャラリーは、選択したファイルをアプリ固有のDocumentsフォルダに複製し利用していた。
色々と検索をして理解をしていたところ、PhotoPickerで選択した後にUIImageデータに変換すると画像データを利用できる事が分かった。
単純に画像表示するなら、この方法で問題ないだろう。
【MyApp.swift】
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
【ContentView.swift】
import SwiftUI
import PhotosUI
struct ContentView: View {
@State var selectedItem: PhotosPickerItem?
@State var selectedImage: UIImage?
var body: some View {
VStack {
if selectedImage != nil {
Image(uiImage: selectedImage!)
.resizable()
.aspectRatio( contentMode: .fill )
}
else {
PhotosPicker(selection: $selectedItem, matching: .images, photoLibrary: .shared()) {
Text("Photo Picker を表示します")
}
}
}
.onChange(of: selectedItem) { item in
Task {
guard let data = try? await item?.loadTransferable(type: Data.self) else { return }
guard let uiImage = UIImage(data: data) else { return }
selectedImage = uiImage
}
}
}
}
サンドボックス構造のファイルに直接アクセスはできないが、システムのピッカーで選択してデータ変換されたものは利用できる。
外部の記憶領域にアクセスする画像ビュワーを作るのは苦戦しそうだが、画像ファイルを修正するアプリはできそうな気がする。
PhotosPickerは、iPadOS 16以降で利用できるそう。