SwiftUI中的ScrollView中的动画过渡和内容

时间:2020-06-06 09:42:14

标签: swiftui transition swiftui-animation

我不是SwiftUI的资深人士,但我已经发布了一些中等复杂度的应用程序。不过,我不能说我完全理解它,我希望知识更深的人能对此问题有所启发:

我有一些想要打开和关闭的内容,与 .sheet()一样,但是我想对其进行更多控制。这是一些“重构”代码,但它应该能够捕捉到本质:

struct ContentView: View {

    @State private var isShown = false

    var body: some View {

        GeometryReader { g in

            VStack {

                ZStack(alignment: .top) {

                    // This element "holds" the size
                    // while the content is hidden
                    Color.clear

                    // Content to be toggled
                    if self.isShown {
                        ScrollView {
                            Rectangle()
                                .aspectRatio(1, contentMode: .fit)
                                .frame(width: g.size.width) // This is a "work-around"
                        } // ScrollView
                            .transition(.move(edge: .bottom))
                            .animation(.easeOut)
                    }

                } // ZStack

                // Button to show / hide the content
                Button(action: {
                    self.isShown.toggle()
                }) {
                    Text(self.isShown ? "Hide" : "Show")
                }

            } // VStack

        } // GeometryReader

    }
}

它的作用是,它打开和关闭某些内容块(在此处由 ScrollView 中的 Rectangle 表示)。发生这种情况时,内容视图会通过从底部移动一些动画而转变。再次点击该按钮,情况就会相反。

这段特定的代码按预期工作,但仅由于以下这一行:

.frame(width: g.size.width) // This is a "work-around"

反过来,这又需要一个额外的 GeometryReader ,否则,内容的宽度会被设置为动画,从而产生不想要的效果(我发现的另一个“修复”是使用。 fixedSize()修饰符,但要产生合理的效果,它要求内容采用自己的宽度,例如 Text

我的明智的问题是:是否可以在不使用此类“修复程序”的情况下很好地转换 ScrollView 中封装的内容?或者,是否有更优雅的解决方案?

@Asperi的回答后面的问题的快速补充:内容应保持可动画显示。 你是我唯一的希望,

–Baglan

1 个答案:

答案 0 :(得分:1)

这是一个解决方案(没有body的{​​{1}}更新)。经过Xcode 11.4 / iOS 13.4的测试

demo

GeometryReader