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

SwiftUI中Transition未按预期工作:slide过渡失效问题咨询

SwiftUI Transition 不生效的原因与修正方案

你搞错了SwiftUI Transition的触发逻辑——Transition只在视图被添加到视图树或者从视图树中移除时才会生效。你当前的代码只是修改了同一个Rectangle的foregroundColor属性,本质上始终是同一个视图,没有发生视图的添加/移除操作,所以只会触发属性变化的默认淡入淡出动画,而非你设置的slide过渡。

要让Transition生效,你需要让change控制两个不同视图的显示与隐藏,让视图树发生真正的插入/移除操作,比如用if-else分支实现:

struct ContentView: View {
    @State var change = false

    var body: some View {
        VStack {
            if change {
                Rectangle()
                    .foregroundColor(.red)
                    .frame(maxWidth: .infinity)
                    .transition(.slide)
            } else {
                Rectangle()
                    .foregroundColor(.green)
                    .frame(maxWidth: .infinity)
                    .transition(.slide)
            }
        }
        .onTapGesture {
            withAnimation {
                change.toggle()
            }
        }
    }
}

另外补充一点:如果只是想给颜色变化添加自定义动画,不需要用Transition,直接给属性绑定动画即可,示例如下:

struct ContentView: View {
    @State var change = false

    var body: some View {
        Rectangle()
            .foregroundColor(change ? .red : .green)
            .frame(maxWidth: .infinity)
            .animation(.easeInOut(duration: 0.5), value: change)
            .onTapGesture {
                change.toggle()
            }
    }
}

这种方式是针对属性变化的动画,和Transition(视图转场动画)的应用场景完全不同,按需选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:39:55