ScrollView中的动画不起作用?使用Xcode 11 beta 6

时间:2019-08-22 01:03:11

标签: animation scrollview swiftui

我试图制作ScrollView过渡动画,但发现在scrollView中它们的工作方式有所不同。但是仍然无法在其中做动画。我正在提供代码,请看一看。使用Xcode 11 beta 6

import SwiftUI 

struct ContentView : View {

@State private var isButtonVisible = false

var body: some View {

    NavigationView {
        ScrollView{
            VStack {
                Button(action: {
                 //   withAnimation {
                        self.isButtonVisible.toggle()
                  //   }
                }) {
                    Text("Press me")
                }

                if isButtonVisible {
                        Text("sss")

                            .frame(height: true ? 50 : 0, alignment: .center)
                              .background(Color.red)
                            .animation(.linear(duration: 2))
                      //  .transition(.move(edge: .top))

                }
            }

        }

    }


}}

2 个答案:

答案 0 :(得分:2)

这一定是一个错误,建议您向Apple提交错误报告。我找到了一种解决方法(请参见下面的代码),但不幸的是它发现了另一个错误!

为了使ScrollView中的动画正常工作,可以将内容封装在自定义视图中。这样可以解决该问题。

这将发现一个新问题,我在代码中添加的边框可以证明这一点:添加“文本”视图时,会将部分内容移到ScrollView之外。

您将看到这是不正确的。尝试使用默认值isButtonVisible = true启动您的应用程序,您会看到它以不同的方式呈现它。

struct ContentView : View {
    var body: some View {
        NavigationView {
            ScrollView {
                EncapsulatedView().border(Color.green)
            }.border(Color.blue)
        }
    }
}

struct EncapsulatedView: View {
    @State private var isButtonVisible = false

    var body: some View {
        VStack {
            Text("Filler")
            Button(action: {
                withAnimation(.easeInOut(duration: 2.0)) {
                    self.isButtonVisible.toggle()
                }
            }) {
                Text("Press me")
            }

            if isButtonVisible {
                Text("sss")
                    .frame(height: true ? 50 : 0, alignment: .center)
                    .transition(.opacity)
                    .background(Color.red)
            }
            Spacer()
        }.border(Color.red)
    }
}

答案 1 :(得分:-1)

.animation(Animation.linear(duration: 2))

您打错电话了