我正在尝试实现一个详细视图,它是从导航视图链接。在这个详细视图中,有一个默认的导航栏顶部与返回按钮。**但该栏只显示一些颜色时,我向上滚动。**我不知道为什么。
无滚动:
滚动:
最初,导航条在滚动或不滚动时都没有背景,所以我创建了一个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
}
5条答案
按热度按时间uujelgoq1#
对我很有效-
dzhpxtsq2#
您需要不透明的外观,因为
default
one意味着system-selected-by-design
,它在不同版本之间会发生变化。已使用Xcode 13.3 / iOS 15.4进行测试(在ContentView.init中)
2nc8po8w3#
使用我的分机:
在viewDidAppear或viewDidLoad中调用它,在您的情况下将背景设置为清除...如何用途:
djmepvbi4#
在viewWillAppear中使用此代码
d5vmydt95#
在Xcode 14.3中,上面的解决方案不起作用,但下面的方法被证明是成功的,并为我解决了这个问题。