SwiftUI-隐藏视图时的动画

时间:2019-12-04 20:17:21

标签: ios swift swiftui

当我在视图的一组实体中显示或隐藏视图时,我试图用SwiftUI找出动画。我有以下代码:

    var body: some View {

        Group {

            if isIntroShown {
                EAIntroViewContentView()
                .transition(AnyTransition.opacity.animation(.easeInOut(duration: 1.0)))
            }

            if mainhomeMode == .mylists {
                MyLists()
                    .onReceive(publisher) { (payload) in
                        self.toggleMainView()
                    }
            } else {
                CarsHome()
                    .onReceive(publisher) { (payload) in
                        self.toggleMainView()
                    }
            }

        }.onReceive(publisherIntro) { (payload) in
            self.onShowIntroButton()
        }
    }

隐藏EAIntroView时,过渡动画可以正常工作,但是该块会弹出,将mainhomeMode向上移动到没有动画的窗口顶部。如何隐藏和显示Intro视图,使隐藏/显示事件变得流畅?

2 个答案:

答案 0 :(得分:1)

您尝试过这样的事情吗?

withAnimation {
    self.toggleMainView()
}

答案 1 :(得分:1)

好吧,经过一些测试和@Boris的回复,我弄清楚了我需要做什么。

代码应如下所示:

    func onShowIntroButton() {
        withAnimation(.easeInOut(duration: 0.5)) {
             isIntroShown.toggle()
        }
    }

    var body: some View {

            VStack{                    
                if isIntroShown {
                    EAIntroViewContentView()
                    .transition(AnyTransition.opacity.animation(.linear(duration: 0.5)))
                }

                Spacer()

                if mainhomeMode == .mylists {
                    MyLists()
                        .onReceive(publisher) { (payload) in
                            self.toggleMainView()
                        }

                } else {
                    CarsHome()
                        .onReceive(publisher) { (payload) in
                            self.toggleMainView()
                        }
                }

        }.onReceive(publisherIntro) { (payload) in
            self.onShowIntroButton()
        }
    }

我正在用通知切换视图。因此,必须从toggle()函数中调用动画。

在这种情况下,当在功能onShowIntroButton()中切换了Intro视图时,我必须调用动画。

VStakSpacer()也使动画更加流畅。希望对其他开发人员有所帮助。