SwiftUI NavigationView滚动折叠

时间:2019-07-30 13:56:57

标签: ios swift swiftui

当滚动时,如何使NavigationBar从large折叠到inline?现在,ScrollView正在滚动其内容,位于NavigationBar标题下方,但在后退按钮之前。

    var body: some View {
        NavigationView {
            ScrollView {
                VStack {
                    ForEach(0...5) { _ in
                        ExerciseView()
                    }
                }
                .padding()
            }
        }
        .navigationBarTitle("Testing", displayMode: .automatic)

1 个答案:

答案 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。至少这样一来,一切都会按照您的预期进行。