SwiftUI - 在旋转设备后,NavigationView的标题和返回按钮被状态栏遮挡

12
每当我将设备旋转到横屏然后再转回来,NavigationView 的顶部(包括标题和返回按钮)都会被剪切在状态栏下面。

最小可重现示例:

struct ContentView: View {
    var body: some View {
        NavigationView {
            ScrollView {
                VStack {
                    ForEach(0..<15) { _ in
                        Text("Filler")
                        .frame(maxWidth: .infinity)
                        .background(Color.green)
                        .padding()
                    }
                }
            }
            .navigationBarTitle("Data")
        }
    }
}

只要内容可以滚动,就会出现故障。我最初是在使用列表时遇到这个问题的。无论我是否先点击一行,进入弹出视图,然后旋转设备,或者只是在主屏幕上旋转回来,都没有关系。
struct ContView: View {
    let data = ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen"]
    var body: some View {
        NavigationView {
            List {
                ForEach(data, id: \.self) { word in
                    NavigationLink(destination:
                        Text("Link")
                    ) {
                        Text(word)
                    }
                }
            }
            .navigationBarTitle("Data", displayMode: .large)
            .listStyle(InsetGroupedListStyle())
        }
    }
}
在主屏幕上旋转 在点击行后旋转

这是一个bug吗,还是我做错了什么?我在控制台中也看到了以下输出:

2020-10-19 09:05:30.613243-0700 MyAppName[43106:5613320] Unbalanced calls to begin/end appearance transitions for <TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVVS_22_VariadicView_Children7ElementGVS_18StyleContextWriterVS_19SidebarStyleContext__: 0x10340c180>.

Xcode版本:12.0(12A7209),运行在iOS 14.0的iPhone 7 Plus上。


2
嗨@aheze,我遇到了同样的问题,没有找到快速解决方案,所以我决定使用自定义视图作为具有固定高度的NavBar。这解决了旋转中的问题,但我认为这不是最好的解决方案。当列表大于视图的高度时,问题就出现了。如果您在列表中只使用5个元素,则在旋转回来时会看到大标题,但如果列表大于设备的高度,则行为会发生变化,您将看到小标题。 - Diego Jiménez
1
是的,我开始认为这是一个 bug。目前,我通过在 sheet 中呈现导航视图来解决它。 - aheze
3
天哪!这正发生在我身上。你向苹果报告了吗?我找到了一个解决方案,将.navigationViewStyle(StackNavigationViewStyle())添加到 NavigationView 中。虽然没有解决问题,但至少我的导航栏标题不再被状态栏遮挡了。 - Harshil Patel
1
@Luffy,实际上我还没有报告... 我会尽快报告的。似乎 StackNavigationViewStyle 开始成为一种通用解决方案(也适用于防止 侧边栏列表样式的白色背景)! - aheze
1个回答

1
尝试为 NavigationView 添加顶部填充。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接