何か地雷を踏みまくっているような・・・。
iOS16+ の話です。
以下、被害者の会。
https://forums.developer.apple.com/forums/thread/712431
以下、ダメなパターン。
import SwiftUI
import PhotosUI
struct ContentView: View {
@State private var selectedPhotoItem: [PhotosPickerItem] = []
var body: some View {
Menu(content: {
Button(action: {}, label: {
Label("写真を撮る", systemImage: "camera")
})
PhotosPicker(selection: self.$selectedPhotoItem, maxSelectionCount: 1, matching: .images, preferredItemEncoding: .automatic, photoLibrary: .shared(), label: {
Label("写真を選択", systemImage: "photo.on.rectangle")
})
}, label: {
Text("写真選択メニュー")
}
}
}
以下、たいした内容じゃないですが、対応版。
import SwiftUI
import PhotosUI
struct ContentView: View {
@State private var selectedPhotoItem: [PhotosPickerItem] = []
@State private var isPresented: Bool = false
var body: some View {
Menu(content: {
Button(action: {}, label: {
Label("写真を撮る", systemImage: "camera")
})
Button(action: {
self.isPresented.toggle()
}, label: {
Label("写真を選択", systemImage: "photo.on.rectangle")
})
}, label: {
Text("写真選択メニュー")
}
.photosPicker(isPresented: self.$isPresented, selection: self.$selectedPhotoItem, maxSelectionCount: 1, matching: .images, photoLibrary: .shared())
}
}
Apple のミュージックアプリのプレイリストの写真追加とかで普通にMenu使ってるからいけると思うじゃないですか。
画面に TextField があって、フォーカスが当たっている(キーボードが表示されている)から PhotosPicker が出せないんじゃないかとか、.sheet の中で出そうとしているからダメなんじゃないか?(.fullScreenCover ならいけるか?)とか、権限要求(Privacy – Photo Library Usage Description を定義)していないからダメなの?(でも、公式動画ではiOS16以降は不要になりましたって言ってるけど)とかなんとか色々考えたけどそんなことは全く関係なかった・・・。
SwiftUI の Menu の中の content とか NavigationStack 用の .toolbar の中とかでの .sheet 的なUIの表示に関しては色々地雷がありそうです。