iOS 15下如何为UITableView不同分区单独设置sectionHeaderTopPadding属性
结论
可以实现该需求。UITableView没有提供直接针对单个section设置sectionHeaderTopPadding的官方API,可通过以下两种稳定方案间接达成效果:
方案1:保留系统默认全局padding,单独抵消目标section的间距
适用场景:需要保留默认padding的section占多数的情况
- 不需要全局修改
sectionHeaderTopPadding,保留系统默认值 - 在header相关代理方法中,针对需要0顶部padding的section,手动抵消系统默认间距
代码示例(Objective-C):
// 预先获取系统默认的sectionHeaderTopPadding值 CGFloat defaultTopPadding = self.tableView.sectionHeaderTopPadding; - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { // 此处替换为你自己需要0 padding的section判断逻辑 BOOL needZeroPadding = (section == 0 || section == 2); CGFloat headerNormalHeight = 40; // 替换为你的header实际高度 if (needZeroPadding) { return headerNormalHeight - defaultTopPadding; } return headerNormalHeight; } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { BOOL needZeroPadding = (section == 0 || section == 2); UIView *headerView = [[UIView alloc] init]; // 针对需要0 padding的section,调整header的y轴偏移抵消系统间距 if (needZeroPadding) { CGRect headerFrame = headerView.frame; headerFrame.origin.y = -defaultTopPadding; headerView.frame = headerFrame; } // 以下添加你自己的header内容控件 UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 0, tableView.bounds.size.width - 30, 40)]; titleLabel.text = [NSString stringWithFormat:@"Section %ld", section]; [headerView addSubview:titleLabel]; return headerView; }
方案2:全局关闭默认padding,手动给指定section添加间距(更推荐)
适用场景:所有场景,逻辑更直观,出现布局异常的概率更低
- 先全局把
sectionHeaderTopPadding设为0,取消所有section的系统默认顶部间距 - 针对需要保留默认padding的section,手动给header添加对应高度的顶部间距
代码示例(Objective-C):
// 全局关闭所有section的默认顶部padding self.tableView.sectionHeaderTopPadding = 0; // 获取系统原本的默认padding值,用于手动补充 CGFloat systemDefaultPadding = [UITableView new].sectionHeaderTopPadding; - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { // 此处替换为你自己需要保留默认padding的section判断逻辑 BOOL needDefaultPadding = (section == 1 || section == 3); CGFloat headerNormalHeight = 40; // 替换为你的header实际高度 if (needDefaultPadding) { return headerNormalHeight + systemDefaultPadding; } return headerNormalHeight; } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { BOOL needDefaultPadding = (section == 1 || section == 3); UIView *headerView = [[UIView alloc] init]; CGFloat contentTopOffset = needDefaultPadding ? systemDefaultPadding : 0; // 以下添加你自己的header内容控件,y坐标从contentTopOffset开始即可 UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, contentTopOffset, tableView.bounds.size.width - 30, 40)]; titleLabel.text = [NSString stringWithFormat:@"Section %ld", section]; [headerView addSubview:titleLabel]; return headerView; }
注意事项
sectionHeaderTopPadding是iOS15新增属性,低于iOS15的系统版本不需要做上述适配- 方案2适配性更强,即使后续系统版本调整默认padding值,也能自动对齐系统样式
内容的提问来源于stack exchange,提问作者Berry Blue
相关产品推荐
相关产品推荐

