如何为SwiftUI列表中的多行移除过渡设置动画?

问题描述 投票:0回答:1

请参阅演示问题的示例视图:

struct ListRemovalTransition: View {
    let list1 = ["A", "B", "C", "D"]
    let list2 = ["A", "E", "F", "G", "H", "I", "J", "K"]

    @State var toggle = false
    var chosenList: [String] {
        toggle ? list1 : list2
    }

    var body: some View {
        VStack {
            Toggle(isOn: $toggle) {
                Text("Switch List")
            }

            List(chosenList, id: \.self) { item in
                Text(item)
                    .transition(AnyTransition.opacity.animation(.default))
            }
        }
        .padding()
    }
}

struct ListRemovalTransition_Previews: PreviewProvider {
    static var previews: some View {
        ListRemovalTransition()
    }
}

transition demo

期望的结果是,当移开而不改变位置时,各个行会淡出。相反,正在发生的事情似乎是所有行在删除之前先相互重叠。我已在“文本”行中添加了带有动画的过渡,但这没有影响。

ios list animation swiftui transition
1个回答
0
投票

只需在id(:)中添加List修饰符即可删除默认动画。然后将transition(:)修饰符添加到List以进行所需的过渡。它运作完美。我刚刚在Xcode 11.5上进行了测试。这是我的代码...

struct ListRemovalTransition: View {
    let list1 = ["A", "B", "C", "D"]
    let list2 = ["A", "E", "F", "G", "H", "I", "J", "K"]

    @State var toggle = false
    var chosenList: [String] {
        toggle ? list1 : list2
    }

    var body: some View {
        VStack {
            Toggle(isOn: $toggle) {
                Text("Switch List")
            }

            List(chosenList, id: \.self) { item in
                Text(item)
            }
            .id(UUID())
            .transition(AnyTransition.opacity.animation(.default))
        }
        .padding()
    }
}

https://media.giphy.com/media/dVu1CMqk3YdtZHefaE/giphy.gif

谢谢。 X_X

© www.soinside.com 2019 - 2024. All rights reserved.