Получайте новые сообщения, сохраняя вид пользовательского интерфейса.IOS

Программируем под IOS
Ответить
Anonymous
 Получайте новые сообщения, сохраняя вид пользовательского интерфейса.

Сообщение Anonymous »

Итак, я пытаюсь написать приложение для чата в SwiftUI. Я использую Firestore в качестве базы данных и пытаюсь получить больше сообщений, сохраняя при этом представление пользовательского интерфейса. Мне нужно обновление пользовательского интерфейса, похожее на эффект Instagram (https://youtube.com/shorts/ZBGCDmPy8CE, в верхней части текущего пользовательского интерфейса появляется кружок загрузки, а затем новые сообщения). Но в моем собственном приложении (), когда я получаю больше сообщений, пользовательский интерфейс перерисовывается, а затем переходит к нужному сообщению, что приводит к замедлению работы пользователя. Как мне добиться эффекта, такого же, как в Instagram?
Кроме того, есть ли более элегантный способ определить, прокручивает ли пользователь до вершины стека? Я использую ScrollOffsetPreferenceKey, чтобы отслеживать расположение представления, что раздражает, поскольку мне нужно постоянно обновлять переменную.
Это мой код:

Код: Выделить всё

struct chatview: View {
@State private var scrollPosition: CGPoint = .zero
@State var messages: [Int] = Array(1...30)
@State var nextElement = 31
@State var lastScrollPosition = 1
@State private var lastAddElementTime: Date = Date()
private let addElementInterval: TimeInterval = 3.0 // only update at most once every three seconds

var body: some View {
NavigationView {
ScrollView {
ScrollViewReader { proxy in
VStack {
ForEach(messages.reversed(), id: \.self) { message in
Text("message \(message)")
.frame(height: 30)
.id(message)
}
}
.background(GeometryReader { geometry in
Color.clear
.preference(key: ScrollOffsetPreferenceKey.self, value: geometry.frame(in: .named("scroll")).origin)
})
.onPreferenceChange(ScrollOffsetPreferenceKey.self) { value in
self.scrollPosition = value
if self.scrollPosition.y > 0 {
let now = Date()
if now.timeIntervalSince(self.lastAddElementTime) >= self.addElementInterval {
self.lastAddElementTime = now
self.lastScrollPosition = messages.count
addElement()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
withAnimation {
proxy.scrollTo(self.lastScrollPosition, anchor: .top)
}
}
}
}
}
.onAppear {
proxy.scrollTo(1, anchor: .bottom) // show the most recent message at the bottom
}
}
}
.coordinateSpace(name: "scroll")
.navigationTitle("Scroll offset: \(scrollPosition.y) \(scrollPosition.x)")
.navigationBarTitleDisplayMode(.inline)
}
}

func addElement() { // add 10 messages in each update
for _ in 0.. CGPoint) {
}
}
Конечно, это не мой настоящий код, но у них одна и та же концепция.
Мне интересно, есть ли способ отобразить представление и прокрутку в фоновом режиме, а затем отображение визуализированного пользовательского интерфейса на экране. Я спросил у ИИ, но ни одно из их решений не решает проблему. Спасибо, ребята!

Подробнее здесь: https://stackoverflow.com/questions/785 ... he-ui-view
Ответить

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

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

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

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

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