如何在SwiftUI视图中初始化绑定的布尔值

时间:2020-09-03 21:42:48

标签: swiftui

修订示例

基于我在下面的评论中收到的@ 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,直到它第一次被实际调用(或将其状态重置为动画的缩小版本)为止,以可行的方式为准。

1 个答案:

答案 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))
    }
}