如何在SwiftUI List中为单独行添加带阶梯延迟的透明度入场动画?
问题原因
- 你定义的
animationDelay是全局共享的@State属性,ForEach渲染所有行视图时,初始读取到的delay值都是0.1 - 父视图的
onAppear会先触发,直接把showListItems设为true,此时所有行的动画已经同步触发,后续行onAppear里累加的delay值不会生效
修正方案
直接通过元素在列表中的索引计算对应延迟即可,不需要额外维护全局delay状态,修正后的代码如下:
struct GuideListView: View { @State var showListItems = false // 保留你原来的viewRouter、data等定义即可 var body: some View { VStack { // 保留原来的其他组件、navLink等内容 List { // 改成带索引的遍历,id用原来元素的唯一标识即可 ForEach(Array(data.enumerated()), id: \.element.id) { index, item in Button(action: { // 保留原来的导航逻辑 }, label: { RowView(item: item) }) .opacity(showListItems ? 1 : 0) // 直接用索引计算当前行的延迟,完全符合你要的递增规则 .animation(.easeOut(duration: 0.6).delay(0.1 + Double(index) * 0.2), value: showListItems) } } } .onAppear { showListItems = true } } }
补充说明
如果你的data数组不是固定不变的,或者需要支持列表滚动后新加载的元素也能按顺序触发动画,可以把动画触发条件调整为和行自身的出现绑定,上述代码已经可以满足基础的依次渐显需求。
内容的提问来源于stack exchange,提问作者blu-Fox
相关产品推荐
相关产品推荐

