新的iOS 15如果在导航栏后面没有元素,则使导航栏背景完全透明。如果有一个列表,并且将元素滚动到导航栏后面,则会获得白色半透明背景,但是如果我使用一个TabView,其中每个TabItem内部都有一个列表,则在切换选项卡项目时导航栏背景没有正确更新,导航栏始终保持透明背景。
我正在使用SwiftUI,我的基本代码如下:
所以,这段代码创建了一个带有五个选项卡的标签视图,每个选项卡都有十个文本视图的列表。如果我切换到任何其他选项卡并将元素滚动到顶部,则可以通过导航栏看到列表,而不是在其后面。
我正在使用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
中添加了一些内容,看起来是一个摆脱导航栏透明度的棘手方法。如果苹果决定在iOS 15中使用这种新设计,我希望能在我的应用程序中实现它,但只有透明度更新正确时才能实现。