如何让SwiftUI视图无动画瞬时返回初始位置?
解决SwiftUI视图滑动后无动画返回初始位置的问题
核心思路是在视图绑定的资产更新时,无动画强制重置offset到零点。因为你是手动循环渲染视图,每次切换资产时触发这个重置操作,就能确保新视图从初始位置开始展示,不会继承之前的偏移量。
修改后的完整代码如下:
import SwiftUI import Photos struct ImageView: View { var asset: BetterUIImage @EnvironmentObject var viewModel: PhotosModel @State private var offset = CGSize.zero var body: some View { ZStack { Image(uiImage: asset.image) .resizable() .frame(width: 320, height: 420, alignment: .center) .aspectRatio(1, contentMode: .fit) .clipShape(RoundedRectangle(cornerRadius: 25)) .shadow(radius: 4) } .offset(x: offset.width, y: offset.height) .rotationEffect(.degrees(Double(offset.width / 40))) .gesture( DragGesture() .onChanged({ gesture in offset = gesture.translation }) .onEnded({ _ in withAnimation { swipeCard(width: offset.width) } }) ) // 新增:监听资产变化,无动画重置offset .onChange(of: asset) { _ in withAnimation(nil) { offset = .zero } } } func swipeCard(width: CGFloat) { switch width { case -500...(-150): // 删除逻辑 offset = CGSize(width: -500, height: 0) viewModel.next() viewModel.appendToPhotosToDelete(asset.asset) case 150...(500): // 保存逻辑 offset = CGSize(width: 500, height: 0) viewModel.next() default: offset = .zero } } } #Preview { ImageView(asset: BetterUIImage(image: UIImage(systemName: "trash")!, asset: PHAsset())) }
关键修改点说明:
- 添加
.onChange(of: asset)修饰器:当传入的asset发生变化(即viewModel.next()切换资产后),立即执行无动画重置操作。 - 使用
withAnimation(nil)明确禁用动画,确保offset瞬间回到零点,不会出现过渡效果。
这样就能实现:视图完成滑动动画后,切换资产时无动画回到初始位置,新的资产视图从零点开始展示。
内容的提问来源于stack exchange,提问作者garrett
相关产品推荐
相关产品推荐

