You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI如何将4行List固定在屏幕底部且保持大标题和页面不可滚动

实现方案

核心逻辑不用硬算边距、也不用全局修改UITableView的contentInset,直接用垂直布局把List挤到屏幕底部即可,不会触发导航栏样式自动切换:

  • 外层用GeometryReader获取当前页面可用区域尺寸,自动适配安全区域、导航栏高度
  • 用VStack做垂直布局,上方加Spacer自动撑满空余空间,List自然固定在底部
  • 直接给List加禁用滚动属性即可,不需要修改全局外观参数

最终代码

var body: some View {
    NavigationView {
        GeometryReader { proxy in
            VStack(spacing: 0) {
                // 上方空白区域自动撑满
                Spacer()
                // 固定在底部的List
                List {
                    Text("hi")
                    Text("hi")
                    Text("hi")
                    Text("hi")
                }
                // 禁用滚动,iOS 16以下可替换为全局UITableView.isScrollEnabled = false
                .scrollDisabled(true)
                // 可根据需求调整List最大高度,行数固定也可以删除这行让List自适应内容高度
                .frame(maxHeight: proxy.size.height * 0.4)
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
        }
        .navigationBarTitle("Hi", displayMode: .large)
    }
}

注意事项

  • 无需手动计算任何边距,Spacer会自动适配不同屏幕尺寸、导航栏高度、安全区域,不会出现偏移问题
  • 只要页面整体内容没有超出可滚动区域,导航栏会始终保持大标题模式,不会自动切换为inline
  • 如果List行数在4-5行之间浮动,删除frame的maxHeight限制即可,List会自动根据内容调整高度,始终贴在屏幕底部

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:57:02