iOS开发如何将Grouped样式下section与导航栏、section间间距设为0
grouped样式静态TableView顶部/Section间距归零方案
问题表现
使用UITableView静态单元格(Static Cell),列表样式设置为grouped时:
- 首个Section分组与顶部导航栏之间存在固定间隙
- 相邻Section分组之间存在默认间距
常规调整列表内边距、Section高度的方式无法消除上述间距。


实现方案
消除导航栏与首个Section的顶部间隙
grouped样式的TableView会默认生成占位高度的tableHeaderView,即便没有主动设置表头也会存在该占位,传入高度为极小非零值的空视图即可覆盖默认值:
// Swift 实现 override func viewDidLoad() { super.viewDidLoad() // 注意:高度不能设为0,设为0系统会回退到默认高度 tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: .leastNonzeroMagnitude)) }
// Objective-C 实现 - (void)viewDidLoad { [super viewDidLoad]; self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, CGFLOAT_MIN)]; }
将相邻Section间距设为0
grouped样式的Section间距由Section头尾的默认占位高度共同控制,实现对应代理方法返回极小值即可清零间距:
// Swift 实现 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return .leastNonzeroMagnitude } func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { return .leastNonzeroMagnitude }
// Objective-C 实现 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return CGFLOAT_MIN; } - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { return CGFLOAT_MIN; }
如果需要给指定Section添加自定义头/尾视图,不要直接返回0高度,在自定义视图内部调整布局约束即可,返回0会触发系统默认高度渲染。
Storyboard可视化配置方式
如果全程使用Storyboard配置静态Cell,无需写代码即可实现效果:
- 选中TableView,将Size Inspector中的
Content Insets -> Top值设为0 - 逐个选中每个Section,将Section的Header高度、Footer高度均设为0.01(不可设为0,设为0系统会自动填充默认高度)
- 若不需要Section头/尾内容,直接删除Section下自带的Header、Footer视图即可
内容的提问来源于stack exchange,提问作者liangdapang
相关产品推荐
相关产品推荐

