Прокрутка снизу вверх в SwiftUI

Как заставить SwiftUI List начать прокрутку снизу экрана (как в режиме чата)?

В идеале я хочу имитировать, например поведение iMessage при обновлении списка, то есть он смещается вниз, если элемент добавляется, когда пользователь находится внизу, но сохраняет свою позицию, если пользователь вручную прокручивает вверх.

Список считывается непосредственно из массива привязок, и при необходимости порядок может быть изменен на обратный.

@komal указал, что UITableView (серверная часть List) имеет atScrollPosition, который должен обеспечивать эту функциональность. Однако, похоже, нет способа получить доступ к базовому представлению без полной переопределения List как UIViewRepresentable, что легче сказать, чем сделать, учитывая, что стандартная реализация полностью закрыта черным ящиком и имеет закрытый исходный код.

С учетом сказанного, я также опубликовал доступ к базовому UITableView из SwiftUI List, которое, если будет решено, могло бы послужить ответом на этот вопрос.


person Potassium Ion    schedule 25.09.2019    source источник


Ответы (2)


Я бы посоветовал вместо использования scrollview использовать UITableView, поскольку Tablview наследует свойство прокрутки UIScrollview. И вы можете использовать "atScrollPosition: UITableViewScrollPositionBottom" для достижения этого поведения.

person Komal    schedule 25.09.2019
comment
Есть ли способ заставить List это сделать? (Например, каким-то образом получить доступ к базовому UITableView при появлении представления?) - person Potassium Ion; 25.09.2019
comment
Я отредактировал свой вопрос, чтобы отразить, где я сейчас нахожусь. - person Potassium Ion; 26.09.2019
comment
Я отправил отзыв с просьбой о поддержке для этого в SwiftUI List. - person Potassium Ion; 27.09.2019

Вы можете попробовать этот способ инвертирования ScrollView:

struct ContentView: View {
    let degreesToFlip: Double = 180

    var body: some View {
        ScrollView(.vertical, showsIndicators: false) {
            ForEach(0..<100) { i in
                HStack {
                    Spacer()
                    Text("Number: \(i)")
                    Spacer()
                }
                .rotationEffect(.degrees(self.degreesToFlip))
            }
            .rotationEffect(.degrees(self.degreesToFlip))
        }
    }
}

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

Проблема с этим подходом заключается в том, что вы инвертируете все в ScrollView, поэтому вы также инвертируете контент, но индикатор прокрутки также меняется на противоположный, поэтому вместо того, чтобы быть справа, индикатор теперь находится слева. Может быть, есть какая-то конфигурация, чтобы индикатор всегда был справа.

Обратите внимание, что я отключил индикатор прокрутки в этом примере кода и что это также применимо к List, но в списках я не нашел способов скрыть индикатор прокрутки.

Надеюсь, это немного поможет.

person Roffe    schedule 09.02.2020
comment
Использование UITableView.appearance (). ShowsVerticalScrollIndicator = false отлично работает у меня на iOS 14. - person Rudrank Riyam; 28.01.2021