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

2k Views Asked by At

In SwiftUI when a popover is displayed, it will display as either a popover or sheet depending on the device (iPad or iPhone) and window space available.

Is there a correct heuristic to check if the popover will be displayed as a popover or a sheet?

For example, on iPad, a popover will show as a sheet when multitasking and vertical or when horizontal at quarter-screen size.

2

There are 2 best solutions below

0
On BEST ANSWER

The answer here is that I needed to pass down horizontalSizeClass from the parent view that was presenting the popover. .environment(\.horizontalSizeClass, horizontalSizeClass) Without this, the child view was reading the horizontalSizeClass that was available to it (which is always compact within a popover).

3
On

Based on my testing you CAN use @Environment(\.horizontalSizeClass) to find out:

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)
        }
    }
}

enter image description here