修订示例
基于我在下面的评论中收到的@ pawello2222的周到答复,我修改了一个示例来演示我正在努力解决的问题。
为了演示这个问题,我使用了两个视图,一个父母和一个孩子。在我的代码中,父视图执行多个步骤,但有时动画子视图在第一步中不可见。但是,当它变得可见时,动画就已经呈现出最终状态。在下面的示例中,您可以看到此行为。
父视图
struct ContentView: View {
@State var firstTime = true
@State var breath = false
var body: some View {
VStack {
// This subview is not displayed until after the first time
if !firstTime {
SecondView(breath: $breath)
}
Spacer()
// A button click simulates the steps in my App by toggling the @Binding var
Button("Breath") {
withAnimation {
self.breath.toggle()
self.firstTime = false
}
}
// This vies shows what happens when the subview is being displayed with an intial state of false for the @Binding var
Spacer()
SecondView(breath: $breath)
}
}
}
这是包含动画并使用@Binding var控制动画外观的子视图。
struct SecondView: View {
@Binding var breath: Bool
var body: some View {
Image(systemName: "flame")
.resizable()
.rotationEffect(.degrees(breath ? 360 : 0), anchor: .center)
.scaleEffect(breath ? 1 : 0.2)
.opacity(breath ? 1 : 0.75)
.animation(.easeInOut(duration: 2))
.foregroundColor(Color.red)
}
}
第一次执行此操作时,将不显示顶部子视图,并且单击按钮时,下部子视图将执行预期的动画,然后切换firstTime变量,以便顶部子视图可见。请注意,动画已完全展开,并且如果我要执行另一步(单击),且@Binding属性的true值相同,则视图将完全不变。这是我要努力解决的问题。如果第一步是切换Bool值的步骤(即使未显示子视图),我也希望保持子视图处于结束状态。换句话说,我只想在子视图实际显示为true时对其进行初始化,以使动画始终从小开始。
这就是为什么我希望子视图将Binding var初始化为false,直到它第一次被实际调用(或将其状态重置为动画的缩小版本)为止,以可行的方式为准。
答案 0 :(得分:0)
您似乎想使用提供的参数初始化_breath
:
struct ContentView: View {
@Binding var breath: Bool
init(breath: Binding<Bool>) {
_breath = breath
}
}
但是,如果要使用恒定值(在示例中为false
),可以执行以下操作:
struct ContentView: View {
@Binding var breath: Bool
init(breath: Binding<Bool>) {
_breath = .constant(false)
}
}
但是,为什么您需要使用breath: Binding<Bool>
参数?
编辑
下面是一个示例,该示例如何使用@Binding
变量控制子视图的动画:
struct ContentView: View {
@State var breath = false
var body: some View {
VStack {
Button("Breath") {
withAnimation {
self.breath.toggle()
}
}
SecondView(breath: $breath)
}
}
}
struct SecondView: View {
@Binding var breath: Bool
var body: some View {
Image(systemName: "flame")
.imageScale(.large)
.rotationEffect(.degrees(breath ? 360 : 0), anchor: .center)
.scaleEffect(breath ? 1 : 0.2)
.opacity(breath ? 1 : 0.75)
.animation(.easeInOut(duration: 2))
}
}