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

SwiftUI中如何替换已被弃用的.animation()修饰符?

解决方案

苹果在iOS 15弃用无指定绑定值的animation(_:)修饰符,核心原因是原API会监听视图所有可动画属性的变化,任意属性变更都会触发动画,容易产生预期外的效果。新API要求明确指定动画的触发条件,有两种常用修改方案:


方案1:使用animation(_:value:)修饰符

你只需要找到当前动画对应的触发状态变量,将其作为value参数传入即可。只有当该变量的值发生变化时,对应的动画才会生效。

假设你的动画是由状态变量offset的变更触发的,修改后的代码如下:

.animation(.easeInOut(duration: 2), value: offset)

完整示例:

struct DemoView: View {
    // 触发动画的状态变量
    @State private var offset: CGFloat = 0
    
    var body: some View {
        Circle()
            .frame(width: 100, height: 100)
            .offset(x: offset)
            // 仅当offset变化时触发2秒缓动动画
            .animation(.easeInOut(duration: 2), value: offset)
            .onTapGesture {
                offset += 100
            }
    }
}

方案2:使用withAnimation闭包包裹状态修改逻辑

如果不想给视图加动画修饰符,也可以在修改状态变量的位置用withAnimation包裹代码,动画仅作用于本次状态变更触发的视图更新。

示例代码:

struct DemoView: View {
    @State private var offset: CGFloat = 0
    
    var body: some View {
        Circle()
            .frame(width: 100, height: 100)
            .offset(x: offset)
            .onTapGesture {
                // 修改状态时指定动画
                withAnimation(.easeInOut(duration: 2)) {
                    offset += 100
                }
            }
    }
}

两种方案都可以完全消除弃用警告,你可以根据自己的业务场景选择:如果动画和某个状态变量强绑定、所有该变量的变更都要触发相同动画,选方案1;如果仅某次状态变更需要动画、其他时候变更不需要动画,选方案2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:15:03