【发布时间】:2021-03-24 23:35:34
【问题描述】:
我想创建一个带有动画条的步进器组件。这是我得到的结果:
这个想法是条应该始终居中,并且我想在值更改时为蓝色条设置动画,但我无法让它工作。
这是我的代码:
struct Stepper: View {
@Binding var currentIndex: Int
var total: Int
var body: some View {
ZStack(alignment: .center) {
ZStack(alignment: .leading) {
Color.gray.opacity(0.4)
Color.blue
.frame(width: 175.5 / CGFloat(total) * CGFloat(currentIndex))
}
.frame(width: 175.5, height: 2)
Text("\(currentIndex)")
.foregroundColor(.black)
.offset(x: -113)
Text("\(total)")
.foregroundColor(.black)
.offset(x: 113)
}
.frame(width: .infinity, height: 18)
}
init(withTotal total: Int,
andCurrentIndex currentIndex: Binding<Int>) {
self._currentIndex = currentIndex
self.total = total
}
func update(to value: Int) {
guard value >= 0, value <= total else {
return
}
withAnimation {
currentIndex = value
}
}
}
以及我如何在容器视图中调用它:
struct StepperVC: View {
@State private var currentIndex: Int = 1
var body: some View {
VStack(spacing: 32) {
Stepper(withTotal: 8, andCurrentIndex: $currentIndex)
Button(action: {
currentIndex += 1
}, label: {
Text("INCREMENT")
})
Button(action: {
currentIndex -= 1
}, label: {
Text("DECREMENT")
})
}
}
}
你能帮我理解为什么动画不起作用吗? 另外,有没有更好的方式来布局 UI?
谢谢!
【问题讨论】: