SwiftUI ScrollView 动画:如何自动滚动并正确缓出?

问题描述 投票:0回答:1

我正在实现一个水平滚动视图,显示我想要自动滚动的绘画的全屏图像。

在动画结束时,它应该以

easeOut
的方式滚动,但尽管我使用
easeOut
,它还是像普通动画一样突然停止。有什么建议吗?

.onAppear {
                    // TODO: lmfao
                    // Scroll a bit to the next image
                    if enableAutoscrollShenanigans {
                        
                        
                        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
                            withAnimation(.smooth(duration: 4.0)) {
                                proxy.scrollTo(0, anchor: .center)
                            }
                            
                            DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                                withAnimation(.smooth(duration: 4.0)) {
                                    proxy.scrollTo(0, anchor: .trailing)
                                }
                                
                                DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                                    withAnimation(.easeOut(duration: 4.0)) {
                                        proxy.scrollTo(1, anchor: .leading)
                                        
                                        // self.startautomaticscrolling = true
                                    }
                                }
                                
                            }
                        }
                        
                    }
                    
                }
ios swift xcode swiftui combine
1个回答
0
投票

所以我想指出一些事情,如果您在

.onAppear
的父视图上使用
ScrollView
,您最终可能会得到意想不到的结果。您无法保证视图是否会在您期望的时间出现。其次,您使用
DispatchQueue
来控制特定动画何时发生,这并不理想。因此,这里有一个拟议的修订,“可以”解决这个问题。我现在没有可用的 IDE,所以请耐心等待。

ScrollViewReader { proxy in
    ScrollView { // Horizontal or Vertical
        // Some ForEach or List of Views
        YourCustomViewA
            .animation(.easeInOut)
            .onAppear {
                proxy.scrollTo(selectedViewId)
            }
    }
}

这样做可以保证滚动行为仅在特定视图位于层次结构上时发生。文档明确指出在 ViewBuilder 执行期间不要执行此操作,我相信这包括

parentView.onAppear
,但是将其移至子级应该可以缓解这种情况。您还应该能够在同一个
.animation(...)
视图上直接使用
child

参考:https://developer.apple.com/documentation/swiftui/scrollviewreader

© www.soinside.com 2019 - 2024. All rights reserved.