我正在构建一个动画进度按钮,显示下载进度,然后在下载完成后展开以显示按钮文本(有点像App Store按钮)。
我有一个自定义按钮视图,该视图接受@Binding到外部进度CGFloat值。我知道我可以通过init设置视图的进度值,但这似乎并不能拉近我的距离。当然,进度会在自定义按钮视图之外发生变化。我希望按钮能够自动处理进度值的更改,并在进度达到1.0时自动展开。
我正在使用显式动画以便对按钮形状进行动画处理(通过在Animation内包含几个私有的@State属性更改)。问题是,当@Binding进度值更改时,我需要能够调用设置那些@State属性的代码。如果没有在按钮视图外部进行显式的withAnimation调用,我将看不到任何方法。我不想使用隐式动画,因为当按钮的原点更改时,这会导致问题。我发现的所有演示都只是通过.onTap在按钮内设置状态。
理想情况下,有一种方法可以在@Binding值更改时调用函数。我已经看到了有关使用发布者的一些信息,但这似乎有点过头了?如果这是唯一的选择,那么我想知道是否可以以某种方式在按钮视图内私下执行该操作,并且仍然将$ progress传递给按钮(以实现最大的可重用性)?
答案 0 :(得分: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))
// ...
}
}