iOS 15中使用TabView时导航栏透明度问题

3
新的iOS 15如果在导航栏后面没有元素,则使导航栏背景完全透明。如果有一个列表,并且将元素滚动到导航栏后面,则会获得白色半透明背景,但是如果我使用一个TabView,其中每个TabItem内部都有一个列表,则在切换选项卡项目时导航栏背景没有正确更新,导航栏始终保持透明背景。
我正在使用SwiftUI,我的基本代码如下:
struct Main: View {
    var body: some View {
        WindowGroup {
            NavigationView {
                TabView {
                    TabElement()
                    TabElement()
                    TabElement()
                    TabElement()
                    TabElement()
                }.navigationBarTitle(Text("Main"), displayMode: .inline).navigationBarBackButtonHidden(true)
            }
        }
    }
}

struct TabElement: View {
    var body: some View {
        VStack {
            List {
               Text("empty")
               Text("empty")
               Text("empty")
               Text("empty")
               Text("empty")
               Text("empty")
               Text("empty")
               Text("empty")
               Text("empty")
               Text("empty")
           }.listStyle(InsetGroupedListStyle())
        }.tabItem {
            Image(systemName: "star.fill")
            Text("dummy")
        }
    }
}

所以,这段代码创建了一个带有五个选项卡的标签视图,每个选项卡都有十个文本视图的列表。如果我切换到任何其他选项卡并将元素滚动到顶部,则可以通过导航栏看到列表,而不是在其后面。

enter image description here

是什么导致了这种行为?是某种错误还是我的代码有问题?由于导航栏始终具有白色背景,因此在 iOS 14.* 中不会出现此问题。

注意: 我发现可以使用以下方法:

if #available(iOS 15, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    UINavigationBar.appearance().standardAppearance = appearance
    UINavigationBar.appearance().scrollEdgeAppearance = appearance
}

我在ApDelegate中添加了一些内容,看起来是一个摆脱导航栏透明度的棘手方法。如果苹果决定在iOS 15中使用这种新设计,我希望能在我的应用程序中实现它,但只有透明度更新正确时才能实现。

2个回答

0

0
TabView包裹在ZStack中解决了我的问题。
ZStack {
    Color.clear
        .ignoresSafeArea()
    TabView {
    ...
    }
}

我怀疑这个工作是因为现在导航栏后面有一个视图,这导致了使用材料背景。

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