问题
I tried running my app in landscape on an iPhone XR simulator and got a blank screen.
The code below is my test. It works correctly on an iPhone 8 simulator and also not the iPhone XR simulator if I remove the NavigationView.
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
GeometryReader { gp in
VStack(alignment: HorizontalAlignment.center) {
Text("Width: \(gp.size.width)")
Text("Height: \(gp.size.height)")
}
}
}
}
}
I expect that I will see the size of the screen in both landscape and portrait.
Does anyone have any experience with this combination?
回答1:
There is nothing wrong. It is just that when a big iPhone is in landscape, its horizontal size class is set to .regular
, instead of .compact
. Think of it, as if it were an iPad.
You can verify it, by sliding from the left size of your screen:
If you change your code to add a default view when nothing is selected, you get this other look:
struct ContentView: View {
var body: some View {
NavigationView {
GeometryReader { gp in
VStack(alignment: HorizontalAlignment.center) {
Text("Width: \(gp.size.width)")
Text("Height: \(gp.size.height)")
NavigationLink(destination: Text("Something got selected")) { Text("Select something") }
}
}
Text("No Selection")
}
}
}
And if you want to force it to .compact, you do the following:
struct ContentView: View {
var body: some View {
NavigationView {
GeometryReader { gp in
VStack(alignment: HorizontalAlignment.center) {
Text("Width: \(gp.size.width)")
Text("Height: \(gp.size.height)")
NavigationLink(destination: Text("Something got selected")) { Text("Select something") }
}
}
Text("No Selection")
}.environment(\.horizontalSizeClass, .compact)
}
}
回答2:
Adding this modifier to the NavigationView works disabling master - detail views.
NavigationView {
// Code
}
.environment(\.horizontalSizeClass, .compact)
来源:https://stackoverflow.com/questions/57344471/any-experience-with-swifui-navigationview-in-landscape-on-iphone-xr-simulator