SwiftUI中如何判断一个popover是显示为popover还是sheet?

How to determine if a popover will be displayed as a popover or sheet in SwiftUI?

在 SwiftUI 中,当显示弹出窗口时,它将显示为弹出窗口或 sheet,具体取决于设备(iPad 或 iPhone)和 window space可用。

是否有正确的试探法来检查弹出窗口是显示为弹出窗口还是 sheet?

例如,在 iPad 上,当多任务处理和垂直或水平四分之一屏幕大小时,弹出窗口将显示为 sheet。

根据我的测试,您可以使用 @Environment(\.horizontalSizeClass) 找出:

struct ContentView: View {
    
    @Environment(\.horizontalSizeClass) var sizeClass
    
    @State private var showPopover = false
    
    var body: some View {
        Button("Show PopOver") {
            showPopover = true
        }
        .popover(isPresented: $showPopover) {
            Text(sizeClass == .regular ? "regular size" : "compact size")
                .frame(width: 300, height: 300)
        }
    }
}

这里的答案是我需要从呈现弹出窗口的父视图向下传递 horizontalSizeClass.environment(\.horizontalSizeClass, horizontalSizeClass) 如果没有这个,子视图正在读取它可用的 horizontalSizeClass(它在弹出窗口中总是紧凑的)。