当我在模型中使用 withAnimation 时,没有动画发生,为啥?

Posted

技术标签:

【中文标题】当我在模型中使用 withAnimation 时,没有动画发生,为啥?【英文标题】:When I use withAnimation in the Model, no animation happens, why?当我在模型中使用 withAnimation 时,没有动画发生,为什么? 【发布时间】:2020-09-16 06:41:33 【问题描述】:

这是我的ViewModel

import SwiftUI

class SetGameVM: ObservableObject 
    @Published var model: SetGame = SetGame()
    
    var cards: Array<SetGame.Card> 
        model.cards
    
   
    func selectCard(card: SetGame.Card) 
        model.selectCard(card: card)
    
    
    func dealCards() 
        model.dealMoreCards()
    

    func reset() 
        model = SetGame()
    

Model

import SwiftUI

struct SetGame 
    var cards: Array<Card>

 mutating func selectCard(card: Card) -> Bool 
        ...
       withAnimation 
        dealMoreCards()
       
       ...
   

如果我在ViewModleView 中使用withAnimation,那么动画会按预期发生,否则如果我在包含一些更改的Model 中使用withAnimationView 仍会反映这些更改,但没有动画发生。

【问题讨论】:

当你改变结构中的一个属性时,你会得到一个新的。我认为这就是您看不到任何动画的原因。 mutating 函数是否仍然创建一个新函数? 【参考方案1】:

在视图模型中执行

func selectCard(card: SetGame.Card) 
    withAnimation                        // << here !!
       model.selectCard(card: card)
    

【讨论】:

我知道这会起作用,但有时我需要一些状态更改动画,而另一些则不需要,所有这些更改都在调用 selectCard 方法时发生,所以我想将这些更改包装在 @987654324 @ 为此你必须使用.animation(..., value: &lt;your state here&gt;)修饰符 value 应该是什么,@StateProperty,我试过这两个动画总是像值一样总是在变化,但实际上不是。 见这个例如***.com/a/63771023/12299030

以上是关于当我在模型中使用 withAnimation 时,没有动画发生,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI视图状态更改使用withAnimation()方法无动画效果的解决

SwiftUI视图状态更改使用withAnimation()方法无动画效果的解决

当@Binding var 值发生变化时,有啥方法可以调用 withAnimation?

Swiftui 中的 Duration 参数 withAnimation(.linear)

当我在另一个视图中使用 CoreData 保存新数据时如何更新模型的另一个实例

用户策略问题当我定义两个用户模型时