SwiftUI ScrollView(的scrollIndicator)移动不需要的内容

e5nqia27  于 12个月前  发布在  Swift
关注(0)|答案(1)|浏览(101)
import Foundation
import SwiftUI

struct TestChatUIView: View {
    @State var models: [TestChatModel2] = []
    
    init() {

    }
    var body: some View {
        ZStack(alignment: .top) {
            ScrollViewReader { scrollViewProxy in
                ScrollView {
                    LazyVStack(spacing: 0) {
                        ForEach(models.indices, id: \.self) { index in
                            VStack {
                                let message = models[index]
                                Text("\(message.id)")
                                    .id(message.id)
                                    .flipped()
                                    .frame(minHeight: 40)
                                    .onAppear {
                                        if index < (3) {
                                            
                                            for i in 0...20 {
                                                let newModel = TestChatModel2(id: "id \(models.count + 1)", date: Date())
                                                models.insert(newModel, at: 0)
                                            }
                                        }
                                    }
                            }
                        }
                        
                    }
                }
                .flipped()
                    
            }
            
            VStack {
                Spacer()
                Button {
                    for int in 0...30 {
                        models.insert(.init(id: "id \(models.count + 1)", date: Date()), at: 0)
                    }
                } label: {
                    Text("loadMore")
                        .background(Color.red)
                }

            }
        }
    }
}

struct TestChatModel2: Identifiable {
    var id: String = UUID().uuidString
    var date: Date
}
extension View {
    
    func flipped() -> some View {
        self.rotationEffect(.radians(Double.pi))
            .scaleEffect(x: -1, y: 1, anchor: .center)
    }
}

字符串
我正在制作聊天系统,这段代码是一个很好的例子。我想要的是当它接近底部时加载更多的消息。但问题是滚动焦点一直定位在底部,所以它导致递归加载更多功能。
如何修复?
我改变了.flipped()修改器的位置,就像在VStack上,ForEach,但它从来没有工作。

jjjwad0x

jjjwad0x1#

我调试了很多,只是发现这是不可行的。即使我使用UIKit(ScrollView+StackView和TableView,CollectionView)进行了相同的逻辑,所有相同的问题都发生了(当一些项目添加到顶部时,滚动移动到仍然顶部)
此外,一些聊天应用程序,如sendbird也无法解决此错误

import Foundation
import SwiftUI

struct TestChatUIView: View {
    @State var models: [TestChatModel2] = []
    @State var modelId: String?
    
    var body: some View {
        ZStack(alignment: .top) {
            ScrollViewReader { scrollViewProxy in
                ScrollView {
                    LazyVStack(spacing: 0) {
                        ForEach(models, id: \.id) { message in
                            Text("\(message.id)")
                                .flipped()
                                .frame(minHeight: 40)
                        }
                    }
                    .scrollTargetLayout()
                }
                .scrollPosition(id: $modelId)
                .flipped()
                VStack {
                    
                    HStack {
                        Button("Prepend") {
                            loadPrev()
                            
                        }
                        Button("Movee") {
                            scrollViewProxy.scrollTo("id 31", anchor: .center)
                        }
                        Button("Append") {
                            loadMore()
                        }
                    }
                    
                }
                
            }
            .onAppear(perform: {
                for int in 0...30 {
                    models.insert(.init(id: "id \(models.count + 1)", date: Date()), at: 0)
                }
            })
        }
    }
    
    func loadMore() {
        for i in 0...20 {
            let newModel = TestChatModel2(id: "id \(models.count + 1)", date: Date())
            models.insert(newModel, at: 0)
        }
    }
    
    func loadPrev() {
        for i in 0...20 {
            let newModel = TestChatModel2(id: "- id \(models.count + 1)", date: Date())
            models.append(newModel)
        }
    }
}

struct TestChatModel2: Identifiable, Equatable {
    var id: String = UUID().uuidString
    var date: Date
}

extension View {
    
    func flipped() -> some View {
        self.rotationEffect(.radians(Double.pi))
            .scaleEffect(x: -1, y: 1, anchor: .center)
    }
}

字符串
但是在代码上面,我补充说。
.scrollTargetLayout().scrollPosition(id: $modelId)

**它为我工作(可悲的是,我的应用程序的目标是iOS 15)。

相关问题