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

SwiftUI 如何通过.transition(.slide)实现数值变化滑动过渡动画

实现方案说明

你没办法直接用.transition(.slide)实现目标效果,原因是默认状态下Text是同一个视图实例,数值更新时SwiftUI只会刷新它的内容,不会触发视图插入/移除的过渡逻辑。你需要给Text绑定和count关联的唯一标识,让SwiftUI在count变化时把旧Text判定为要移除的视图、新Text判定为要插入的视图,才能触发滑动过渡。

修改后的可运行代码如下:

struct ContentView: View {
    @StateObject var viewModel = ViewModel()

    var body: some View {
        VStack(spacing: 64) {
            Text(viewModel.count.description)
                .font(.largeTitle)
                // 绑定id让SwiftUI识别为不同视图
                .id(viewModel.count)
                // 添加滑动过渡
                .transition(.slide)
            Button("递增", action: viewModel.increment)
        }
        // 给整个容器加动画修饰符,让过渡生效
        .animation(.default, value: viewModel.count)
    }
}

final class ViewModel: ObservableObject {
    @Published var count = 0

    func increment() {
        count += 1
    }
}

如果需要完全匹配你要求的旧数值左滑消失、新数值右滑出现的效果,也可以自定义更精准的过渡:

extension AnyTransition {
    static var customSlideReplace: AnyTransition {
        .asymmetric(
            insertion: .move(edge: .trailing),
            removal: .move(edge: .leading)
        )
    }
}

把上文代码里的.transition(.slide)替换为.transition(.customSlideReplace)即可。

内容的提问来源于stack exchange,提问作者Godfather

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:06:03