Кроме того, есть ли более элегантный способ определить, прокручивает ли пользователь до вершины стека? Я использую 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
Мобильная версия