You need to enable JavaScript to run this app. SwiftUI开发中Form与下方结果列表异常间距问题如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI开发中Form与下方结果列表异常间距问题如何解决?

问题原因

SwiftUI 中Form组件默认会按照系统表单布局规则自动分配垂直高度,不会收缩到仅适配内容尺寸,导致顶部输入区域占用了超出实际需要的屏幕空间,下方的结果列表就被挤到了屏幕中部位置。

修复方案

有两种常用修复方式,可根据业务需求选择:

方案1:保留Form,增加高度自适应修饰符

仅需要在原有Form上添加.fixedSize(horizontal: false, vertical: true)修饰符,让Form在垂直方向贴合内容高度即可,同时可以给外层VStack设置spacing: 0消除默认组件间距,效果更贴合:

struct Lookup: View {
    @State var query = ""

    var body: some View {
        // 新增spacing: 0消除组件默认间距
        VStack (alignment: .leading, spacing: 0) {
            Form {
                VStack {
                    HStack {
                        TextField("Text Field", text: $query)
                        Button(
                            action: {
                                print("Button Hit")
                                
                            }, label: {
                                Image(systemName: "magnifyingglass.circle")
                            })
                    }
                }.padding()
            }
            // 新增这行,让Form垂直方向自适应内容高度
            .fixedSize(horizontal: false, vertical: true)
            
            ScrollView {
                ForEach(1..<11) { resultNumber in
                    ResultRow(resultNumber: resultNumber)
                }
            }
        }
    }
}

方案2:替换Form为普通VStack(更轻量)

如果不需要Form自带的分组、系统表单样式特性,直接把外层的Form替换成普通VStack即可,省去处理Form默认行为的成本:

struct Lookup: View {
    @State var query = ""

    var body: some View {
        VStack (alignment: .leading, spacing: 0) {
            // 替换原Form为普通VStack
            VStack {
                HStack {
                    TextField("Text Field", text: $query)
                    Button(
                        action: {
                            print("Button Hit")
                            
                        }, label: {
                            Image(systemName: "magnifyingglass.circle")
                        })
                }
            }
            .padding()
            // 如果需要和原Form一致的背景色可以加这行,不需要可删除
            .background(Color(UIColor.systemGroupedBackground))
            
            ScrollView {
                ForEach(1..<11) { resultNumber in
                    ResultRow(resultNumber: resultNumber)
                }
            }
        }
    }
}

两种方案修改后,结果列表都会紧贴输入区域下方展示。

内容的提问来源于stack exchange,提问作者StripyTiger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 02:51:01