我有一个覆盖了半页的视图(由于缺乏更好的术语),它覆盖了屏幕的下半部分。它的实现是这样的:
.sheet(isPresented: $showSender, content: {
SenderView()
.presentationDetents([.medium])
}
如果我在启动时将
showSender
设置为 true,它看起来就很好。但是,我希望在选择照片时弹出该表。当所选照片发生变化时,我使用 PhotosPicker
并将 showSender
设置为 true:
PhotosPicker("Send Pictures", selection: $photoPicked, matching: .images)
.onChange(of: photoPicked) { value in
self.showSender = true
}
然而,奇怪的是,在这种情况下,纸张覆盖了整个屏幕。有什么想法吗?这是一个最小的重现。谢谢。
import SwiftUI
import PhotosUI
struct SenderView: View {
var body: some View {
Text("Sender View")
}
}
struct ContentView: View {
@State var showSender = false
@State var photoPicked: PhotosPickerItem? = nil
var body: some View {
VStack {
PhotosPicker("Send Pictures", selection: $photoPicked, matching: .images)
.onChange(of: photoPicked) { value in
self.showSender = true
}
}
.padding()
.sheet(isPresented: $showSender, content: {
SenderView()
.presentationDetents([.medium])
})
}
}
#Preview {
ContentView()
}
我认为这是由于在关闭照片选择器时显示工作表并破坏了所有内容造成的。这可能不是故意的,可能会在未来的 iOS 版本中修复。在 macOS 上,这可以按预期工作。
另一种方法是先展示表格,然后立即展示照片选择器。如果用户未选择任何照片,请关闭该工作表。
struct SenderView: View {
@Binding var photoPicked: PhotosPickerItem?
@State var showPhotoPicker = true
@Environment(\.dismiss) var dismiss
var body: some View {
Text("Sender View")
.photosPicker(isPresented: $showPhotoPicker, selection: $photoPicked, matching: .images)
.onChange(of: showPhotoPicker) { oldValue, newValue in
if !newValue && photoPicked == nil {
dismiss()
}
}
}
}
struct ContentView: View {
@State var showSender = false
@State var photoPicked: PhotosPickerItem? = nil
var body: some View {
VStack {
Button("Send Pictures") {
showSender = true
}
}
.padding()
.sheet(isPresented: $showSender, content: {
SenderView(photoPicked: $photoPicked)
.presentationDetents([.medium])
})
}
}