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
相关产品推荐
相关产品推荐

