You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:46:15