Мне нужна вертикальная прокрутка, которая бесконечна в обоих направлениях: прокрутка вверх или вниз вниз приводит к динамическому добавлению большего количества элементов. Почти вся помощь, с которой я сталкивался, касается только бесконечности нижней стороны. Я наткнулся на этот соответствующий ответ, но это не то, что я специально ищу (он добавляет элементы автоматически в зависимости от продолжительности , и требует взаимодействия с кнопками направления, чтобы указать способ прокрутки). Этот менее актуальный ответ, однако, был довольно полезный. Основываясь на сделанном там предложении, я понял, что могу вести учет элементов, видимых в любое время, и, если они окажутся позициями X сверху / снизу, вставить элемент в начальный / конечный индекс в списке.
Еще одно замечание: я начинаю список с середины, поэтому нет необходимости добавлять что-либо в любом случае, если вы не переместились на 50% вверх / вниз.
Чтобы было ясно, это для экрана календаря, который я хочу, чтобы пользователь мог свободно прокручивать в любое время.
struct TestInfinityList: View {
@State var visibleItems: Set<Int> = []
@State var items: [Int] = Array(0...20)
var body: some View {
ScrollViewReader { value in
List(items, id: \.self) { item in
VStack {
Text("Item \(item)")
}.id(item)
.onAppear {
self.visibleItems.insert(item)
/// if this is the second item on the list, then time to add with a short delay
/// another item at the top
if items[1] == item {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
withAnimation(.easeIn) {
items.insert(items.first! - 1, at: 0)
}
}
}
}
.onDisappear {
self.visibleItems.remove(item)
}
.frame(height: 300)
}
.onAppear {
value.scrollTo(10, anchor: .top)
}
}
}
}
В основном это работает нормально, за исключением небольшой, но важной детали. Когда элемент добавляется сверху, в зависимости от того, как я прокручиваю вниз, иногда он может быть скачкообразным. Это наиболее заметно ближе к концу прикрепленного зажима.
Я пробовал ваш код и не смог ничего исправить с помощью List OR ScrollView, но это возможно как uiscrollview, который бесконечно прокручивается.
1. оберните этот uiscrollView в UIViewRepresentable
}
2. это весь мой код для бесконечно прокручиваемого uiscrollview
}
внимательно следите за ним, это в значительной степени говорит само за себя, взято из идеи WWDC 2011, вы сбрасываете смещение до середины экрана, когда подходите достаточно близко к краю, и все сводится к мозаичному размещению ваших представлений, чтобы все они отображались одним сверху друг друга. если вам нужны какие-либо разъяснения по этому классу, спрашивайте в комментариях. когда у вас есть эти 2 выяснения, вы приклеиваете SwiftUIView, который также находится в предоставленном классе. на данный момент единственный способ, чтобы представления были видны на экране, — это указать явный размер для hosting.view, если вы выясните, как сделать размер SwiftUIView размером hosting.view, сообщите мне в комментариях, я ищу ответ на это. надеюсь, что код кому-то поможет, если что-то не так, оставьте комментарий.
После изучения вашего кода я считаю, что эта нервозность, которую вы видите, вызвана следующим:
Если вы удалите оба и оставите только
items.insert(items.first! - 1, at: 0)
, нервозность прекратится.