我正在实现一个水平滚动视图,显示我想要自动滚动的绘画的全屏图像。
在动画结束时,它应该以
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
}
}
}
}
}
}
所以我想指出一些事情,如果您在
.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