当滚动时,如何使NavigationBar从large
折叠到inline
?现在,ScrollView
正在滚动其内容,位于NavigationBar
标题下方,但在后退按钮之前。
var body: some View {
NavigationView {
ScrollView {
VStack {
ForEach(0...5) { _ in
ExerciseView()
}
}
.padding()
}
}
.navigationBarTitle("Testing", displayMode: .automatic)
答案 0 :(得分:4)
首先要注意的是,navigationBarTitle
应该是ScrollView
的修饰符,而不是NavigationView
。
var body: some View {
NavigationView {
ScrollView {
VStack {
ForEach(0...5) { _ in
ExerciseView()
}
}
.padding()
}
.navigationBarTitle("Testing", displayMode: .automatic)
}
}
摘自navigationBarTitle
的文档:
仅当此视图在NavigationView中并在NavigationView中可见时,此修饰符才会生效。
根据displayMode
的文档,请记住另一件事:
case automatic
从上一个导航项继承显示模式。
如果您使用.automatic
,则告诉NavigationView
使用与上一个导航项目相同的显示模式,这意味着如果您从displayMode
为.inline
,那么您的新视图也将继承该显示模式。
将navigationBarTitle
修饰符移至ScrollView
之后,问题仍然存在-滚动视图在导航栏标题和后退按钮文本下方滚动,就像缺少导航栏的背景一样
对this question的回答通过在状态栏文本下方滚动List
来解决类似的问题,因此我使用了他们在ScrollView
上添加填充的建议。这种工作方式是,滚动视图现在可以在导航栏下方正确滚动,但是滚动时,导航栏仍无法从.large
折叠到.inline
。
对我来说,这真的像是个虫子。首先,不需要在滚动视图上设置填充。该视图不知道是否将其嵌套在NavigationView
中,所以为什么只需要指定填充即可使导航栏正常工作?
同时,我只建议将displayMode
设置为.inline
。至少这样一来,一切都会按照您的预期进行。