SwiftUI,NavigationView 在旋转时消失?

zum*_*zum 3 swiftui

我想弄清楚为什么旋转设备会使内容消失。

这是我正在运行的确切代码:

struct ContentView: View {
    @State private var selection = 0

    init() {

    }

    var body: some View {

        NavigationView {

            VStack {
                Button(action: {

                }) {
                    Text("Tap me")
                    .padding()
                    .foregroundColor(.white)
                    .background(Color.blue)
                    .cornerRadius(8)
                }.shadow(color: Color.blue, radius: 20, y: 5)
                    .frame(width: 300, height: 100, alignment: .trailing)

                Text("SwiftUI")
                    .navigationBarTitle("Nav Title")
            }

            Color.red.edgesIgnoringSafeArea([.top,.bottom,.leading,.trailing])

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如何解决此问题,以便旋转设备以保持内容可见?

在“Liem Vo”回答后提供更多反馈。

如果我在 iPhone 11 Pro 上运行代码,而不是在最大值上运行,它就可以工作。 在此处输入图片说明

在最大时运行它时,“主视图”在横向屏幕左侧离开屏幕,可以通过在其上滑动来拉入。我不知道在 SwiftUI 中使用 NavigationView 的这种行为,所以这就是我的原因。

这是 MAX 上没有“Liem Vo”建议的修复程序的行为: 在此处输入图片说明

Lie*_* Vo 5

问题在于横向模式视图已更改,因此您需要以不同的模式处理视图。

创建一个扩展方法如下

extension View {
    func phoneOnlyStackNavigationView() -> some View {
        if UIDevice.current.userInterfaceIdiom == .phone {
            return AnyView(self.navigationViewStyle(StackNavigationViewStyle()))
        } else {
            return AnyView(self)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在您看来使用此方法。

struct ContentView: View {
    @State private var selection = 0
    var body: some View {

        NavigationView {

            VStack {
                Button(action: {

                }) {
                    Text("Tap me")
                        .padding()
                        .foregroundColor(.white)
                        .background(Color.blue)
                        .cornerRadius(8)
                }.shadow(color: Color.blue, radius: 20, y: 5)
                    .frame(width: 300, height: 100, alignment: .trailing)

                Text("SwiftUI")
                    .navigationBarTitle("Nav Title")
            }

            Color.red.edgesIgnoringSafeArea([.top,.bottom,.leading,.trailing])

        }
        .phoneOnlyStackNavigationView()

    }
}
Run Code Online (Sandbox Code Playgroud)

更多细节可以参考https://www.hackingwithswift.com/books/ios-swiftui/making-navigationview-work-in-landscape