Сохранить позицию прокрутки в ScrollView при добавлении новых элементовIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Сохранить позицию прокрутки в ScrollView при добавлении новых элементов

Сообщение Anonymous »

В настоящее время я борюсь за свою чату моего приложения. Это пример кода того, чего я хочу достичь. Он обладает функциональностью, такой как, когда пользователь собирается достичь вершины, он приносит более старые сообщения, и когда внизу он приносит новые сообщения. Это была та же проблема при получении более старых сообщений (он непрерывный прокручивался вверх), но я исправил его с помощью модификатора Flippuft (). Но нижняя проблема все еще существует. < /P>
struct ChatMessage: View {

let text: String

var body: some View {
HStack {
Text(text)
.foregroundStyle(.white)
.padding()
.background(.blue)
.clipShape(
RoundedRectangle(cornerRadius: 16)
)
.overlay(alignment: .bottomLeading) {
Image(systemName: "arrowtriangle.down.fill")
.font(.title)
.rotationEffect(.degrees(45))
.offset(x: -10, y: 10)
.foregroundStyle(.blue)
}
Spacer()
}
.padding(.horizontal)
}
}

struct Message : Identifiable,Equatable {
var id: Int
var text: String
}

struct GoodChatView: View {

@State var messages: [Message] = []

@State private var scrollViewProxy: ScrollViewProxy? // Store the proxy

@State var messageId: Int?

var body: some View {
ScrollViewReader { scrollView in
ScrollView {

LazyVStack {

ForEach(messages, id: \.id) { message in
ChatMessage(text: "\(message.text)")
.flippedUpsideDown()
.onAppear {
if message == messages.last {
print("old data")
loadMoreData()
}
if message == messages.first {
print("new data")
loadNewData()
}
}

}
}
.scrollTargetLayout()
}
.flippedUpsideDown()
.scrollPosition(id: $messageId)
.onAppear {

for i in 1...20 {
let message = Message(id: i, text: "\(i)")
messages.append(message)
}

messageId = messages.first?.id
}

}
}

func loadMoreData() {

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
let count = messages.count

var newMessages: [Message] = []

for i in count+1...count+20 {
let message = Message(id: i, text: "\(i)")
newMessages.append(message)
}

messages.append(contentsOf: newMessages)

}
}

func loadNewData() {

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {

let count = messages.count

var newMessages: [Message] = []

for i in count+1...count+20 {
let message = Message(id: i, text: "\(i)")
newMessages.append(message)
}

newMessages = newMessages.reversed()

messages.insert(contentsOf: newMessages, at: 0)

}

}
}

struct FlippedUpsideDown: ViewModifier {
func body(content: Content) -> some View {
content
.rotationEffect(.radians(Double.pi))
.scaleEffect(x: -1, y: 1, anchor: .center)
}
}

extension View {
func flippedUpsideDown() -> some View {
modifier(FlippedUpsideDown())
}
}

< /code>
Любая помощь ценится. Если есть другие способы достичь этого, пожалуйста, дайте мне знать 🙂

Подробнее здесь: https://stackoverflow.com/questions/791 ... -new-items
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»