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
相关产品推荐
相关产品推荐

