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

Posted

技术标签:

【中文标题】当@Binding var 值发生变化时,有啥方法可以调用 withAnimation?【英文标题】:Any way to call withAnimation when @Binding var value changes?当@Binding var 值发生变化时,有什么方法可以调用 withAnimation? 【发布时间】:2020-01-18 09:51:31 【问题描述】:

我正在构建一个动画进度按钮,它显示下载进度,然后在下载完成后展开以显示按钮文本(有点像 App Store 按钮)。

我有一个自定义按钮视图,它采用@Binding 到外部进度 CGFloat 值。我知道我可以通过 init 设置视图的进度值,但这似乎并没有让我更接近。进度当然在自定义按钮视图之外发生了变化。我希望能够让按钮自动处理进度值更改并在进度达到 1.0 时自动扩展。

我正在使用显式动画来为按钮形状设置动画(通过在 withAnimation 中包含几个私有 @State 属性更改)。问题是我需要能够在@Binding 进度值更改时调用设置这些@State 属性的代码。如果没有在按钮视图之外发生显式 withAnimation 调用,我看不到任何方法。我不想使用隐式动画,因为这会在按钮的原点更改时引起问题。我发现的演示都只是通过 .onTap 在按钮内设置状态。

理想情况下,有一种方法可以在 @Binding 值更改时调用函数。我见过一些关于使用发布者的东西,但这似乎有点矫枉过正?如果这是唯一的选择,那么我想知道我是否可以在按钮视图中以某种方式私下执行此操作,并且仍然只是将 $progress 传递给按钮(以获得最大的可重用性)?

【问题讨论】:

【参考方案1】:

有用于此目的的 API

@available(ios 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
extension Binding 

    ...

    /// Create a new Binding that will apply `animation` to any changes.
    public func animation(_ animation: Animation? = .default) -> Binding<Value>

所以可以做类似的事情

struct ContentView: View 

  @State private var value = 0

  var body: some View 
    // ...
    ChildView(value: $value.animation(.linear))
    // ...
  

【讨论】:

这个问题是我需要能够以不同的方式为不同的元素设置动画(例如,我不希望按钮中的文本在延迟之后才显示)。【参考方案2】:

不确定这是否有帮助,但如果您不知道可以创建自己的 Binding 并自定义 setter 和 getter,例如将 withAnimation 和您想要的任何逻辑放在那里:

@State private var fooValue: String // Use fooBinding instead of $fooValue
private var fooBinding: Binding<String> 
        Binding<String>(
            get:  return self.fooValue ,
            set:  updatedValue in
                withAnimation 
                    self.fooValue = updatedValue
                
            
        )
    

在这个例子中,由于这个绑定而改变的东西应该被动画化。

【讨论】:

以上是关于当@Binding var 值发生变化时,有啥方法可以调用 withAnimation?的主要内容,如果未能解决你的问题,请参考以下文章

当 coreData 值发生变化时,如何更新我的其他视图?

当参考范围内的值发生变化时,VBA 更新公式

当 ref 的值发生变化时,Vue 不会更新模板 Vue 3

仅当烧瓶中的变量发生变化时才更新网站

当 uitableviewcell 中 uipickerview 的值发生变化时,我需要更新 viewcontroller 中的标签

当redux store中的值发生变化时,如何更新formik中的特定表单字段?