SwiftUI: запретить расширение представления внутри VStack

У меня есть такой 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)

  }

Проблема с этим кодом заключается в том, что List пытается максимально расширить контент, занимая здесь весь экран, несмотря на то, что у него всего 4 контакта.

Я могу установить эту высоту на фиксированное значение, используя frame(height: 240)

Я считаю, что есть возможность заставить List оборачивать его содержимое, как это делает представление Text(). то есть, если есть 4 строки в содержимом переноса списка, чтобы отобразить только эти 4 строки, если есть 8 строк, расширьте до этих 8 строк. Затем я мог бы установить максимальную высоту, например. 400, выше которого список больше не может расширяться, и тогда его можно будет прокручивать.

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)

        }
    }
}
Другие вопросы по тегам