我有这样的意见时,点击图像动画的特定图像应被触发。然而,它似乎是非常不一致的,出于某种原因触发其他图像以及。
我是不是漏掉了什么?
struct ImagesView: View {
let segments: [String] = ["1", "2", "3", "4"]
@State private var selected: String = "1"
@Namespace var name
var body: some View {
HStack(spacing: 0) {
ForEach(segments, id: \.self) { segment in
ZStack {
ImageView(tab: segment, selected: $selected)
.padding()
}
}
}
}
}
fileprivate struct ImageView: View {
var tab: String
@Binding var selected: String
@State var animate = false
var body: some View {
Image(systemName: "calendar")
.font(.largeTitle)
.symbolRenderingMode(.monochrome)
.symbolEffect(.bounce, value: animate)
.onTapGesture {
selected = tab
}
.onChange(of: selected) { _, newValue in
withAnimation {
animate = newValue == tab
}
}
}
}
2条答案
按热度按时间ltskdhd11#
每当
animate
发生变化时,动画就会发生,而不是每当它是true
时。想想当你点击一个图像时,这条线会引起什么样的动画。对于您点击的图像,
animate
最初将是false
,因为上次运行时,newValue == tab
为false。现在,newValue == tab
是true
。所以你点击的图像是动态的。对于先前选择的图像,
animate
最初将是true
,newValue == tab
将是false
,因为您选择了不同的图像。这意味着先前选择的图像也将被动画化。实际上,您只需要在
newValue == tab
为true时更改animate
。(我不确定
animate
是否是一个好名字,也许animationTrigger
更好)zd287kbt2#
这可能是工作