iOS 15上NavigationView导航栏的材质不可见。

6
在iOS 15中,使用.inline模式的NavigationView应用程序不再显示模糊的材料颜色,而是显示导航栏。

示例代码:

struct ContentView: View {
    var body: some View {
        NavigationView {
            ZStack {
                Color.red.ignoresSafeArea()
                
                Text("Content")
            }
            .navigationBarTitleDisplayMode(.inline)
        }
    }
}

比较:

iOS 14.4 iOS 15
iOS 14.4 result iOS 15 result

我该如何修复这个问题以保留 iOS 14 的行为?


1
我认为这是一种新的设计方式。这与TabView相同 - 当背景不滚动时,就没有线条了。如果您将ZStack放入ScrollView中,则可以获得旧的行为,但有点不同。 - aheze
1
@aheze 我在 Twitter 上听说这是“UIKit 中的新功能”之一,所以我可能会观看那个 WWDC 会议,并使用 Introspect 更改行为...但我希望有更好的解决方案。 - George
@workingdog 很遗憾对我没用。 - George
2个回答

0
尽管不完美,但有一种方法可以使用SwiftUI-Introspect解决这个问题。
它仍然存在一个问题,即在第一次呈现时,更改还没有产生效果。
我发现的解决方案部分是从这里发现的。
通过 Introspect,我添加了以下代码:
NavigationView {
    /* ... */
}
.introspectNavigationController { navController in
    navController.navigationBar.scrollEdgeAppearance = navController.navigationBar.standardAppearance
    navController.navigationBar.isTranslucent = true
}

现在它可以工作了,但如果有一个100% SwiftUI的解决方案会更好。


1
当导航条总是内联时,这对我很有效,但是在有大型导航标题的页面上,它会显示灰色背景和标题底部的线条 - 有什么想法可以恢复大型标题的正常透明外观吗? - sia
1
@sia 我不确定,我放弃了并接受了这个变化。但是如果你在寻找一个UIKit的解决方案,那就是你需要的。单帧闪光对我来说是个致命问题,这就是为什么我决定不使用这段代码的原因。 - George

0
一个解决方法是这样的:
 struct ContentView: View {
    
    var body: some View {
        NavigationView {
            ZStack {
                // choose your color here
                Color(red: 1, green: 0.8, blue: 0.8).ignoresSafeArea()
                Color.red.edgesIgnoringSafeArea(.bottom)
                Text("Content")
            }.navigationBarTitleDisplayMode(.inline)
        }
    }
}

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