我正在构建一个动画进度按钮,显示下载进度,然后在下载完成后展开以显示按钮文本(有点像 App Store 按钮)。
我有一个自定义按钮视图,它采用 @Binding 到外部进度 CGFloat 值。我知道我可以通过 init 设置视图的进度值,但这似乎并没有让我更接近。当然,进度在自定义按钮视图之外会发生变化。我希望能够让按钮自动处理进度值更改并在进度达到 1.0 时自动扩展。
我使用显式动画来为按钮形状设置动画(通过在 withAnimation 中包含几个私有 @State 属性更改)。问题是,当 @Binding 进度值更改时,我需要能够调用设置这些 @State 属性的代码。如果不在按钮视图之外发生显式的 withAnimation 调用,我看不到任何方法可以做到这一点。我不想使用隐式动画,因为当按钮的原点发生变化时,这会导致问题。我发现的演示都只是通过 .onTap 在按钮内设置状态。
理想情况下,有一种方法可以在 @Binding 值更改时调用函数。我见过一些关于使用发布商的内容,但这似乎有点矫枉过正?如果这是唯一的选择,那么我想知道我是否可以以某种方式在按钮视图内私下执行此操作,并且仍然将 $progress 传递给按钮(以获得最大的可重用性)?
有用于此目的的 API
Run Code Online (Sandbox Code Playgroud)@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))
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
706 次 |
| 最近记录: |