SwiftUI:防止视图在 VStack 内展开

Posted

技术标签:

【中文标题】SwiftUI:防止视图在 VStack 内展开【英文标题】:SwiftUI: Prevent view being inside VStack to expand 【发布时间】:2019-12-05 15:43:08 【问题描述】:

我有这样的 VStack,里面有列表

 VStack(alignment: .leading, spacing: 16) 
                        Text("Contacts")
                            .font(.custom("AvenirNext-DemiBold", size: 20))
                            .foregroundColor(Color("DarkTitle"))
                            .padding(8).layoutPriority(1)

                        List(self.contacts)  contact in
                            ContactOption(contact: contact)
                                .padding(.horizontal, 4)
                         //.frame(height: 240)

  

此代码的问题在于,尽管只有 4 个联系人,但 List 会尝试尽可能多地扩展内容,从而占据整个屏幕。

我可以使用frame(height: 240)将此高度设置为固定值

我认为是否有可能强制 List 像 Text() 视图那样包装其内容。 即如果列表包装内容中有 4 行仅显示这 4 行,如果有 8 行扩展到这 8 行。然后我可以设置一些最大高度。 400 上面的 List 无法再展开,然后它将是可滚动的。

【问题讨论】:

我认为这是同一个问题***.com/questions/58060530/… 【参考方案1】:

好的,我尝试了一下,我不确定你是否可以使用它,但请检查一下:(只需点击添加和删除即可查看列表如何变大和变小)

struct ContactOption : View 

    var contact: String

    var body: some View 
        Text(contact)
    


struct ListView : View 

    var contacts: [String]

    var body : some View 

        //        List(self.contacts, id: \.self)  contact in
        //            ContactOption(contact: contact)
        //                .padding(.horizontal, 4)
        //        
        List 
            ForEach (contacts, id: \.self)  contact in
                Text (contact)
            
        
    


struct ContentView: View 

    @State var contacts = ["Chris", "Joe", "Carla", "another"]

    var body: some View 
        VStack() 
            HStack 
                Button("Add") 
                    self.contacts.append("dust")
                
                Button("Remove") 
                    self.contacts = self.contacts.dropLast()
                
            
            Text("Contacts")
                .foregroundColor(Color.blue)
                .padding(8).layoutPriority(1)

            Form 
                ListView(contacts: contacts)
                Section(footer: Text("hi")) 
                    Text("hi")
                
            

            Divider()
            Text("end list")
                .foregroundColor(Color.orange)

        
    

【讨论】:

什么是ListView

以上是关于SwiftUI:防止视图在 VStack 内展开的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI VStack 间距:无法正常工作

SwiftUI,删除VStack中视图之间的空间?

SwiftUI:将视图与 VStack 中另一个视图的前缘和后缘对齐

SwiftUI中ScrollView底部对齐内的VStack

SwiftUI:如何让滚动视图包含完整列表长度

SwiftUI - 点击按钮更改 VStack 的背景颜色