自定义可折叠视图

Posted

技术标签:

【中文标题】自定义可折叠视图【英文标题】:Custom collapsible view 【发布时间】:2021-07-16 11:57:48 【问题描述】:

我正在尝试创建。代码有效,但在Collapsible<Content: View>VStack 有奇怪的行为:当组件关闭时元素重叠。 要注意这一点,请尝试禁用clipped(),如图所示。

这是一个错误还是我没有注意到的愚蠢的东西? 提前致谢

固定代码:

struct Collapsible<Content: View>: View 
    var label: String
    var content: () -> Content
    init(label: String, @ViewBuilder _ content: @escaping () -> Content) 
        self.label = label
        self.content = content
    
    @State private var collapsed: Bool = true
    
    var body: some View 
        VStack(spacing: 0) 
            Button(action: 
                withAnimation(.easeInOut) 
                    self.collapsed.toggle()
                
            , label: 
                    HStack 
                        Text(label)
                        Spacer(minLength: 0)
                        Image(systemName: self.collapsed ? "chevron.down" : "chevron.up")
                    
                    .padding()
                    .background(Color.white.opacity(0.1))
                
            )
            .buttonStyle(PlainButtonStyle())
            self.content()
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: collapsed ? 0 : .none, alignment: .top) // <- added `alignment` here
            .clipped() // Comment to see the overlap
            .animation(.easeOut)
            .transition(.slide)
        
    


struct CollapsibleDemoView: View 
    var body: some View 
        VStack(alignment: .leading, spacing: 0) 
            Collapsible(label: "Collapsible") 
                Text("Content")
                .padding()
                .background(Color.red)
            
            Spacer(minLength: 0)
        
        .padding()
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    

【问题讨论】:

【参考方案1】:

.frame 修饰符有一个默认为 center 的参数对齐方式,这会导致您看到的行为:布局边界设置为零高度,但内容在边界之外垂直居中呈现(如果未剪裁)。您可以通过添加对齐来解决此问题:

.frame(maxHeight: 0, alignment: .top)

【讨论】:

您好,谢谢您的回答! max Height:0 显然不会出现内容。而是将alignement: .top 添加到.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: collapsed ? 0 : .none, alignment: .top) 解决问题!谢谢!我更新了我的代码 这就是我的意思,我只是简化了例子:)

以上是关于自定义可折叠视图的主要内容,如果未能解决你的问题,请参考以下文章

可折叠部分和每个部分的多个自定义 UITableViewCell

如何在android中实现自定义可折叠工具栏?

可扩展 UiTableView 的自定义单元格

Android 可折叠自定义ExpandTextView

自定义手风琴/可折叠 UITableViewCell 的自动布局

来自 NIB 的可扩展自定义 UITableViewCell