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

标签 swiftui

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

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

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

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

最佳答案

有用于此目的的 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))
    // ...
  }
}

关于swiftui - 当@Binding var 值发生变化时,有什么方法可以调用 withAnimation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59799352/

相关文章:

SwiftUI - 无法填充工作表底部的屏幕

ios - 所以。我试图让我的文本字段下的字符数在屏幕上增加,但它没有增加

SwiftUI 身份验证 View

SwiftUI 将 TupleView 转换为 AnyView 数组

ios - 带有 SwiftUI + 拖放重新排序的 UICollectionView 可能吗?

swift - 如何根据 SwiftUI 中的 @State 更改导航 View 的导航 View 样式?

ios - SwiftUI:如何增加可以触发按钮的区域?

swift - 在 ARKit 和 RealityKit 中使用 Raycast 的真正好处是什么?

ios - 滚动时SwiftUI NavigationBar不会消失

SwiftUI:如何在 macOS 11 上使用 NSSearchToolBarItem?