代码之家  ›  专栏  ›  技术社区  ›  tech_human

SwiftUI-删除2个列表之间的空格(iOS 16)

  •  0
  • tech_human  · 技术社区  · 2 年前

    我正在使用SwiftUI开发一个复杂的应用程序,但我创建了一个小样本工作应用程序来解释我的问题。我有一张纸/面板,上面有两个单独的列表,我无法弄清楚是什么原因导致两个列表之间有这么多空间。

    面板B 在我下面的代码中,是我所说的有列表的内容 '日期时间视图' '结果显示列表' .

    PanelA可能是不必要的代码,但我添加它只是为了显示我的应用程序的流程,以防任何PanelA逻辑导致它。你知道两个列表之间出现额外空间的原因是什么吗?

    图片:

    enter image description here

    代码:

    import SwiftUI
    import Foundation
    
    struct ContentView: View {
        @State var showPanel: Bool = false
        var body: some View {
           NavigationStack {
                VStack {
                    Text("Hello World - Click Me").font(.largeTitle).foregroundColor(.blue)
                        .onTapGesture {
                            self.showPanel = true
                        }
                }.sheet(isPresented: $showPanel) {
                    ZStack {
                        Color.secondary
                        PanelA().padding(.top, 15.0)
                    }
                }
           }
        }
    }
        
    struct PanelA: View {
        @State var showPanel: Bool = false
        var body: some View {
            NavigationStack {
                VStack {
                    Button {
                        showPanel = true
                    } label: {
                        Text("Click Me")
                    }
                    .buttonBorderShape(.roundedRectangle(radius: 15.0))
                    .padding()
                    .background(Color.teal)
                }
                .presentationDetents([.medium, .large])
                .presentationBackgroundInteraction(.enabled)
                .navigationDestination(isPresented: $showPanel) {
                    PanelB()
                }
            }
        }
    }
    
    struct PanelB: View {
        var body: some View {
            ZStack {
               Color.purple.edgesIgnoringSafeArea(.all)
                VStack {
                    DateTimeView().padding(.bottom, 20.0)
                    ResultsDisplayList()
                    Spacer()
                }
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .background(Color.purple)
            }
        }
    }
    
    struct DateTimeView: View {
        @State private var startDateTime = Date.now
        @State private var isAllDay = true
    
        var body: some View {
            List {
                Section("Event Date".uppercased()) {
                    Toggle("all day", isOn: $isAllDay)
                    DatePicker(selection: $startDateTime, in: startDateTime..., displayedComponents: [.date]) {
                        Text("select date time").font(.body).foregroundColor(Color.black)
                    }
                }
            }
            .listStyle(.insetGrouped)
        }
    }
    
    struct ResultsDisplayList: View {
        let results = ["Apple", "Orange", "Pineapple", "Cherries", "Strawberries", "Banana"]
        var body: some View {
            ScrollViewReader { _ in
                VStack(alignment: .leading, spacing: 8.0) {
                    List {
                        Section {
                            ForEach(results, id: \.hashValue) { result in
                                Text(result).font(.body)
                            }
                        } header: {
                            Text("Results List")
                        }
                    }
                }
            }
            .onAppear {
                UITableView.appearance().backgroundColor = .clear
                UITableViewCell.appearance().backgroundColor = .clear
            }
        }
    }
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Jose Quintero    2 年前

    这很可能是因为您使用了两个列表(添加到视图时会占用所有可用空间,还有VStack和ScrollView)。

    看起来 ScrollViewReader VStack 你添加到结果中没有任何用处。尝试使用列表的单个实例来包装所有部分。

    如果您期望的布局需要这些包装器(List不支持这些包装器作为子级),则可能需要提取 DateTimeView 并使用List以外的东西重新创建ui。