Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios scrollview中的SwiftUI动画/转换行为奇怪_Ios_Swift_Animation_Swiftui_Scrollview - Fatal编程技术网

Ios scrollview中的SwiftUI动画/转换行为奇怪

Ios scrollview中的SwiftUI动画/转换行为奇怪,ios,swift,animation,swiftui,scrollview,Ios,Swift,Animation,Swiftui,Scrollview,我在SwiftUI中有一个包含多个元素的ScrollView,其中一些元素可以随时展开 struct ExpandingView: View { @State var showContent = false var body: some View { VStack { HStack { Button(action: {withAnimation { self

我在SwiftUI中有一个包含多个元素的ScrollView,其中一些元素可以随时展开

struct ExpandingView: View {

    @State var showContent = false

    var body: some View {
        VStack {
            HStack {
                Button(action: {withAnimation {
                        self.showContent.toggle()
                    }
                }) {
                    Image(systemName: "chevron.right.circle")
                }
                Text("TITLE")
                    .padding(.leading, 10)
                Spacer()
            }
            if showContent {
                Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras volutpat dapibus ante eget laoreet. Aenean lacus elit, auctor ut nisl id, fermentum pretium mi. Quisque lacus nisl, suscipit hendrerit est sed, congue dictum augue. Suspendisse semper viverra accumsan. Maecenas commodo turpis convallis nisl bibendum pharetra.")
                    .transition(AnyTransition.move(edge: .top).combined(with: .opacity))
            }
        }
    }
}

struct Test: View {

    var body: some View {
        ScrollView {
            ExpandingView()
            ExpandingView()
            ExpandingView()
            Text("Some static text")
        }
    }
}
如果你试着打开其中一个展开的文本,你会看到过渡不是平滑的,它有点像跳跃,然后过渡开始了

以下是我尝试过的:

  • 例如,如果我删除scrollview并将其放在VStack中,它可以正常工作,但这不是一个选项,因为我有更多的元素无法显示在屏幕上
  • 我尝试为scrollview设置动画,因为我读到它解决了此类问题,如下所示:
它在开头过渡方面工作得很好,甚至在使用spring效果时看起来更好,但是当视图出现时,整个scrollview的spring动画会播放,这是我不想要的


同样,如果我将ScrollView更改为VStack,动画在出现时不会播放,这很好,但我必须使用ScrollView。因此,对我来说,最好的解决方案是保留打开文本的动画,但在视图出现时以某种方式将其删除。

这里是可能的解决方案。也可以在线阅读评论。使用Xcode 11.4/iSO 13.4进行测试

struct ExpandingView:View{
@状态变量showContent=false
var body:一些观点{
VStack{
HStack{
按钮(操作:{
self.showContent.toggle()
}) {
图像(系统名称:“V形。右。圆”)
}
文本(“标题”)
.padding(.leading,10)
垫片()
}
如果显示内容{
文本(“Lorem ipsum door sit amet,concetetur adipiscing elite.Cras volatipat dapibus ante eget laoreet.Aenean lacus elit,auctor ut niss id,breatum pretium mi.Quisque lacus nisl,suscipit hendrerit est sed,congue dictum augue.Suspendisse semper viverra acumsan.Maecenas commodo turpis convallis niss bibendum pharetra.”)
.fixedSize(水平:假,垂直:真)
.transition(AnyTransition.move(边:。顶部)。与:。不透明度组合)
}
}
}
}
结构DemoExpandingView:视图{
//初始零以避免初始动画
@国家私有变量动画:动画?=nil
var body:一些观点{
滚动视图{
VStack{
展开视图()
展开视图()
展开视图()
文本(“一些静态文本”)
}.动画(动画)//
ScrollView {
            ExpandingView()
            ExpandingView()
            ExpandingView()
            Text("Some static text")
        }.animation(.spring())
struct ExpandingView: View {

    @State var showContent = false

    var body: some View {
        VStack {
            HStack {
                Button(action: {
                        self.showContent.toggle()
                }) {
                    Image(systemName: "chevron.right.circle")
                }
                Text("TITLE")
                    .padding(.leading, 10)
                Spacer()
            }
            if showContent {
                Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras volutpat dapibus ante eget laoreet. Aenean lacus elit, auctor ut nisl id, fermentum pretium mi. Quisque lacus nisl, suscipit hendrerit est sed, congue dictum augue. Suspendisse semper viverra accumsan. Maecenas commodo turpis convallis nisl bibendum pharetra.")
                    .fixedSize(horizontal: false, vertical: true)
                    .transition(AnyTransition.move(edge: .top).combined(with: .opacity))
            }
        }
    }
}

struct DemoExpandingView: View {

    // initial nil to avoid initial animation
    @State private var animation: Animation? = nil
    var body: some View {
        ScrollView {
            VStack {
                ExpandingView()
                ExpandingView()
                ExpandingView()
                Text("Some static text")
            }.animation(animation) // << needed to animate static section
        }
        .onAppear {
            DispatchQueue.main.async {
                // assign in-container animation `after` container rendered
                self.animation = .default
            }
        }
    }
}