如何在 SwiftUI 列表中使用自定义视图平滑展开行单元格?

coc*_*ner 8 iphone list ios swiftui

我正在尝试通过点击手势扩展行单元格(这是自定义视图)。单元格高度必须增加,并且按钮正在扩展区域中移动。但我得到了以下跳跃的动画效果。按下的蓝色卡将保持稳定,但会跳来跳去。

在此输入图像描述

重现这个跳跃动画的简单代码:

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello, World!")
            List {
                Detail(isExpanded: false)
                Detail(isExpanded: false)
                Detail(isExpanded: false)
            }
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}



struct Detail: View {
    @State var isExpanded :Bool
    var body: some View {
        ZStack {
            ZStack {
                RoundedRectangle(cornerRadius: 8)
                .fill(Color(red: 0.0, green: 1.0, blue: 1.0, opacity: 1.0)).frame(height: 115)
                Text("Hello, World!")
            }.zIndex(3).frame(height: 115).contentShape(Rectangle()).onTapGesture {
                withAnimation {
                    self.isExpanded.toggle()
                }
            }
            Button(action: {
            }) {
                ZStack {
                    RoundedRectangle(cornerRadius: 50)
                        .fill(Color(red: 1.0, green: 0.0, blue: 1.0, opacity: 1.0)).frame(height: 70)
                        .cornerRadius(8)
                        .shadow(radius: 3)
                        Text("Test")
                }
            }.padding([.leading, .trailing], 12)
                .padding(.top, 6)
                .frame(height: 70)
                .buttonStyle(BorderlessButtonStyle())
                .offset(y: self.isExpanded ? 0 : 40)
                .disabled(!self.isExpanded)
        }.frame(height: self.isExpanded ? 120 : 200)
    }
}
Run Code Online (Sandbox Code Playgroud)

我很感激任何关于如何解决这个问题的提示或提示。

编辑

单击时,hello world 卡应与单元格本身的顶部保持对齐。就像这样: 在此输入图像描述

Asp*_*eri 7

只需使用此解决方案中的可动画修改器

使用 Xcode 11.4 / iOS 13.4 进行测试

演示

ZStack {
 // .. other your code here
}
.modifier(AnimatingCellHeight(height: self.isExpanded ? 120 : 200))
Run Code Online (Sandbox Code Playgroud)

  • @cocos2dbeginner,行内部内容设计(原创)与平滑动画的主题问题无关......一问一答。 (2认同)