【问题标题】:How to disable animation in list when observed object changes in SwiftUI?当SwiftUI中观察到的对象发生变化时如何禁用列表中的动画?
【发布时间】:2019-11-23 23:23:21
【问题描述】:

如何在视图模型数据更改时禁用动画?

我有以下代码:

struct FormView: View {

    @ObservedObject var viewModel: FormViewModel

    var body: some View {
        List {
            ForEach(viewModel.options) { option in
                Text(option.displayValue)
            }
        }
    }
}

每次视图模型更改 List 都会更新动画。
如何禁用它?
我尝试添加.animation(nil),但没有帮助

【问题讨论】:

    标签: ios swiftui


    【解决方案1】:

    我认为最好的解决方案是将 UUID() 设置为动画值输入:

            .animation(nil, value: UUID())
    

    【讨论】:

      【解决方案2】:

      我找到的解决方案是添加一个每次都会更改的唯一标识符,因此它每次都会重建列表而无需动画。在 iOS 13.4 上验证。

      var body: some View {
          List {
              ForEach(viewModel.options) { option in
                  Text(option.displayValue)
              }
          }
          .id(UUID()) // no animation
      }
      

      【讨论】:

      • 实际上,.animation(nil) 为我工作。发生了一个奇怪的错误,比如抛出异常。
      • @StephenLee 的答案是更好的答案。使用.id(UUID()),您可以防止 SwiftUI 计算视图的增量,从而在某些内容发生更改时重绘所有内容。
      【解决方案3】:

      在 Apple 给我们更改以在 List 上执行此操作之前,解决方法是调用 List.id(_:) 它改变了 List 的内部状态并强制 List 立即重新创建,没有任何动画。详情见List reload animation glitches

      在任何 View 上都可以这样做(func id() 是 View 协议的一部分),但是您必须知道所有状态变量都将具有初始“默认”状态,因此请谨慎使用。就像“重新创建”视图一样。

      要了解它的工作原理,请参阅https://swiftui-lab.com/swiftui-id/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-27
        • 2022-11-16
        • 1970-01-01
        • 2020-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多