SwiftUI Infinity scroll (вверх и вниз)

Это простой пример бесконечной прокрутки. Как добавить бесконечность к прокрутке вверх
и вставить строки в начало:

  rows.insert(contentsOf: Array(repeating: "Item 0", count: 20), at: 0)

Как яблоко в календаре.

struct Screen: View { 
    @State var rows: [String] = Array(repeating: "Item", count: 20)

    private func getNextPageIfNecessary(encounteredIndex: Int) { 
        guard encounteredIndex == rows.count - 1 else { return } 
        rows.append(contentsOf: Array(repeating: "Item", count: 20)) 
    }

    var body: some View {
      ...      
                 List(0..<rows.count, id: \.self) { index in
                           Text(verbatim: self.rows[index]) 
                               .onAppear {
                                   self.getNextPageIfNecessary(encounteredIndex: index)
                               }
                       }

person Tim    schedule 26.11.2019    source источник
comment
вы можете добавить пустую чистую строку в конце, а в этом onAppear вы можете добавить больше строк ....   -  person Chris    schedule 26.11.2019
comment
да. Я знаю. Как это на высоте! Не в конце!   -  person Tim    schedule 26.11.2019


Ответы (1)


Вот самая простая идея. Он колючий, и, конечно, его можно настроить и улучшить (например, отменить, улучшить время и т. Д.), Но идея остается ... Надеюсь, это будет как-то полезно.

struct TestInfinityList: View {
    @State var items: [Int] = Array(100...120)
    @State var isUp = false
    var body: some View {
        VStack {
            HStack {
                Button(action: { self.isUp = true }) { Text("Up") }
                Button(action: { self.isUp = false }) { Text("Down") }
            }
            Divider()
            List(items, id: \.self) { item in
                Text("Item \(item)")
            }
            .onAppear {
                DispatchQueue.main.async {
                    self.goNext()
                }
            }
        }
    }

    func goNext() {
        self.isUp ? self.moveUp() : self.moveDown()
    }

    func moveUp() {
        self.items.insert(self.items.first! - 1, at: 0)
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
            self.goNext()
        }
    }

    func moveDown() {
        _ = self.items.removeFirst()
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
            self.items.append(self.items.last! + 1)
            self.goNext()
        }
    }
}
person Asperi    schedule 27.11.2019