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

