Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
264 views
in Technique[技术] by (71.8m points)

ios - SwiftUI - Fast sequences of explicit animation produces strange animations

The following code contains a list of text and a button to add more texts. When an item is added, the scroll view should scroll to the second to last (for simplicity in this example) item.

import SwiftUI

struct ContentView: View {
    
    @StateObject private var viewModel = ViewModel()
    
    var body: some View {
        createView()
    }
    
    private func createView() -> some View {
        return VStack {
            ScrollView {
                ScrollViewReader { scrollProxy in
                    VStack {
                        ForEach(viewModel.ids, id: .self) { id in
                            Text(viewModel.texts[id]!)
                                .padding()
                        }
                    }.onAppear {
                        viewModel.scrollProxy = scrollProxy
                    }
                }
            }
            Button("Add") {
                viewModel.onAdd()
            }.padding()
        }
    }
}

class ViewModel: ObservableObject {
    @Published var ids: [UUID]
    @Published var texts: [UUID: String]
    @Published var responderID: UUID?
    
    var scrollProxy: ScrollViewProxy?
    
    init() {
        let id = UUID()
        self.ids = [id]
        self.texts = [id: "0"]
    }
    
    func onAdd() {
        
        let lastID = ids[ids.count - 1]
        
        // create new block
        let newID = UUID()
        ids.append(newID)
        self.texts[newID] = String(ids.count)
        
        withAnimation {
            scrollProxy?.scrollTo(lastID)
        }
    }
    
}

When tapping the button slowly, the scroll animation works fine.

But when the button is tapped quickly, the animation is ... broken? The animation slows to a crawl, taking a long time to complete.

So my question is, is there another way to animation the scrolling? I've tried using CADisplayLink, but the result is also pretty bad...


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
等待大神答复

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...