新的 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")
}
}
}
因此,这段代码创建了一个包含五个选项卡的选项卡视图,每个选项卡都有一个包含十个文本视图的列表,如果我切换到任何其他选项卡并将元素滚动到顶部,则可以通过导航栏而不是后面看到该列表。
是什么导致了这种行为?这是某种错误还是我的代码错误?这个问题在 iOS 14.* 中不会发生,因为导航栏始终具有白色背景。
注意: 我发现可以使用:
if #available(iOS 15, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
UINavigationBar.appearance().standardAppearance = appearance
UINavigationBar.appearance().scrollEdgeAppearance = appearance
}
...在我的
ApDelegate
中,但这看起来是一种消除导航栏中透明度的棘手方法。如果 Apple 决定在 iOS 15 中使用这种新设计,我想在我的应用程序中实现它,但前提是透明度正确更新。
是的,苹果在 iOS 15 中改变了这一点。
如果您想更改单个 ViewController 中导航栏的外观,可以使用以下代码:https://stackoverflow.com/a/69493819/9263676
将
TabView
包裹在ZStack
中为我解决了这个问题:
ZStack {
Color.clear
.ignoresSafeArea()
TabView {
...
}
}
我怀疑这可行,因为现在导航栏后面有一个视图,这会导致使用材质背景。