【发布时间】:2022-08-09 21:31:18
【问题描述】:
我正在尝试实现从导航视图链接的详细视图。 在此详细视图中,顶部有一个默认导航栏,带有一个后退按钮。但是当我向上滚动时,该栏只显示一些颜色。我不知道为什么。
最初,导航栏在滚动或不滚动时都没有背景。 所以我创建了一个 init() 方法来设置样式。
init(fruit: Fruit) {
self.fruit = fruit
if #available(iOS 15.0, *) {
let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.configureWithDefaultBackground()
UINavigationBar.appearance().standardAppearance = navigationBarAppearance
UINavigationBar.appearance().compactAppearance = navigationBarAppearance
UINavigationBar.appearance().scrollEdgeAppearance = navigationBarAppearance
}
}
Body View 是外部的导航视图和内部的滚动视图。 ** 对于任何人想知道为什么我将导航栏设置为隐藏在 VStack 中,是因为如果我不隐藏它,图像上方会有一些巨大的空间。 (我不知道为什么)
** 更新代码 ** 我更新了使用不透明背景的代码。 但似乎这些配置都不可见。
init(fruit: Fruit) {
self.fruit = fruit
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithOpaqueBackground()
UINavigationBar.appearance().scrollEdgeAppearance = navBarAppearance
UINavigationBar.appearance().standardAppearance = navBarAppearance
}
var body: some View {
NavigationView {
ScrollView(.vertical, showsIndicators: false) {
VStack(alignment: .center, spacing: 20) {
// HEADER
FruitHeaderView(fruit: fruit)
VStack(alignment: .leading, spacing: 20) {
// TITLE
Text(fruit.title)
.font(.largeTitle)
.fontWeight(.heavy)
.foregroundColor(fruit.gradientColors[1])
} //: VSTACK
.padding(.horizontal, 20)
.frame(maxWidth: 640, alignment: .center)
} //: VSTACK
.navigationBarHidden(true)
} //: SCROLL
.edgesIgnoringSafeArea(.top)
} //: NAVIGATION
.navigationBarTitle(fruit.title, displayMode: .inline)
.navigationViewStyle(StackNavigationViewStyle())
}
*** 解决方案 *** 事实证明,我必须将导航栏的配置代码放在父视图中。在 init() 期间。谁能在父视图上解释为什么会这样?或者,如果我想要父母和孩子的风格不同,我该怎么办?
init() {
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithOpaqueBackground()
UINavigationBar.appearance().scrollEdgeAppearance = navBarAppearance
UINavigationBar.appearance().standardAppearance = navBarAppearance
}
var body: some View {
NavigationView {
List {
ForEach(fruits.shuffled()) { item in
NavigationLink {
FruitDetailView(fruit: item)
} label: {
FruitRowView(fruit: item)
.padding(.vertical, 4)
}
}
}
.listStyle(.plain)
.navigationTitle(\"Fruits\")
} //: NAVIGATION
}
-
使用
navigationBarAppearance.configureWithTransparentBackground()代替 .configureWithDefaultBackground() -
这是否回答了您的问题stackoverflow.com/a/65523676/12299030?
-
@Asperi 不,我不想要一个透明的导航栏。我希望导航栏具有与滚动时相同的非透明背景。
标签: ios swift swiftui scroll transparent