SwiftUI中观察到的对象更改时如何禁用列表中的动画?


15

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

我有以下代码:

struct FormView: View {

    @ObservedObject var viewModel: FormViewModel

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

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

Answers:


1

直到Apple给我们做出更改才能在List上进行更改的解决方法是调用List.id(_ :),它更改List的内部状态并强制List立即重新创建,而没有任何动画。有关详细信息,请参见列出重新加载动画故障。

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

为了能够了解其工作原理,请参阅https://swiftui-lab.com/swiftui-id/


1

我发现的解决方案是添加一个每次都会更改的唯一标识符,因此它将在没有动画的情况下每次都重新构建列表。在iOS 13.4上验证。

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

-3
  1. 如果您不使用,则无需在List内使用ForEach Section。所以代替:

    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        })
    }

    以下代码足以编写:

    List(viewModel.options) { option in
        Text(option.displayValue)
    }

    而且最好知道使用ForEach会产生一些问题,例如:SwiftUI:是否可以使用ForEach + ContextMenu?

  2. 如果您只使用+ ForEach()或仅使用List()+ .animation(nil)-必须解决您的问题:

    范例1:

    ForEach(viewModel.options) { option in
        Text(option.displayValue)
    }.animation(nil)

    范例2:

    List(viewModel.options) { option in
        Text(option.displayValue)
    }.animation(nil)

    我已经在macOS 10.15.2(19C57)上进行了测试,并且工作正常。

  3. 你也可以尝试使用.animation(nil)ListForEach两者。我没有尝试...但是我认为这也会给您带来所需的效果。

    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        }.animation(nil)
    }.animation(nil)

.animation(nil)似乎有13.3没有影响,不幸的是
法比安Streitel

@FabianStreitel我已经在macOS 10.15.2(19C57)上测试了第2部分,它运行完美。
安德鲁(Andrew)

而且我已经在iOS 13.3上测试了所有三个变体(如我在上面的评论中所述),它们都没有改变List的行为。不幸的是,OP没有说明他们是在制作iOS还是macOS应用。但是我认为它在iOS上不起作用的信息也与其他人有关。
Fabian Streitel

我最近在.animation(nil)Xcode 11.4和iOS 13.4上进行了测试,它对我有用。
西门
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.