Липкий нижний колонтитул в List SwiftUI - PullRequest
2 голосов
/ 20 июня 2020

Я пытаюсь реализовать липкий нижний колонтитул в представлении списка в SwiftUI

Кажется, он не работает так же, как заголовок, как говорят. Это пример реализации липкого заголовка

     List {
      ForEach(0..<10) { index in
        Section(header: Text("Hello")) {
          ForEach(0..<2) { index2 in
            VStack {
              Rectangle().frame(height: 600).backgroundColor(Color.blue)
            }
          }
        }.listRowInsets(EdgeInsets())
      }
    }

Это выше дает ситуацию липкого заголовка. Хотя, когда я меняю Section(header: ... на Section(footer:..., он больше не кажется липким, он просто помещается в конец строки.

Более явная ссылка

 List {
  ForEach(0..<10) { index in
    Section(footer: Text("Hello")) {
      ForEach(0..<2) { index2 in
        VStack {
          Rectangle().frame(height: 600).backgroundColor(Color.blue)
        }
      }
    }.listRowInsets(EdgeInsets())
  }
}

Есть ли у кого-нибудь решения по этому поводу?

1 Ответ

0 голосов
/ 09 июля 2020

С последней версией SwiftUI (2) теперь у нас есть доступ к еще нескольким API

Для начала мы можем использовать LazyVStack с ScrollView, чтобы дать нам довольно хорошую производительность, тогда мы можем используйте pinnedViews API, чтобы указать в массиве, какое дополнительное представление мы хотим закрепить или сделать закрепленным. Затем мы можем использовать представление раздела, которое обертывает наш контент и указывает либо нижний колонтитул, либо заголовок.

** Этот код работает с Xcode beta 2 **

Что касается использования этого в List Не совсем уверен, будет интересно посмотреть производительность с List vs Lazy...

struct ContentView: View {
  var body: some View {
    ScrollView {
      LazyVStack(spacing: 10, pinnedViews: [.sectionFooters]) {
        ForEach(0..<20, id: \.self) { index in
          Section(footer: FooterView(index: index)) {
            ForEach(0..<6) { _ in
              Rectangle().fill(Color.red).frame(height: 100).id(UUID())
            }
          }
        }
      }
    }
  }
}

struct FooterView: View {
  
  let index: Int
  
  var body: some View {
    VStack {
      Text("Footer \(index)").padding(5)
    }.background(RoundedRectangle(cornerRadius: 4.0).foregroundColor(.green))
  }
}


struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    ContentView()
  }
}

...