如何删除分组UITableView顶部的空白区域?

Hig*_*ule 17 objective-c uitableview

当您UITableView使用UITableViewStyleGrouped样式创建时,它会在实际的tableviewcells和表格框架的边框之间添加相当多的空间(或"缓冲").这个空间位于tableviewcells的上方,下方,左侧和右侧.

您可以通过以下方式更改tableviewcells之间的空间:

[myTableView setSectionHeaderHeight:0];
[myTableView setSectionFooterHeight:25];
Run Code Online (Sandbox Code Playgroud)

然而,即使通过这样做,在帧的顶部和第一个tableviewcell之间仍然存在这个恼人的空间.此外,框架左侧和桌面单元之间仍有大量空间,框架右侧和桌面单元也是如此.

- = - = - = - = - = - = -

基本上,有没有办法操纵那个空间(调整它的大小)?到目前为止,我唯一的解决方案是使框架的尺寸大于屏幕,以使程序伪造成在屏幕外面具有"空白空间",从而将其移除.然而,这显然不是最佳的并且是明显的黑客攻击.

有什么想法吗?提前致谢!

Jam*_*son 71

这个答案很晚,但我希望它可以帮到某个人.

这个空间因为它UITableViewtableHeaderView财产而存在.当tableHeaderView属性是nilApple默认视图时.所以解决这个问题的方法是创建一个高度大于的空视图0.设置此选项会覆盖默认视图,从而删除不需要的空间.

这可以在故事板中完成,方法是将视图拖动到顶部,tableView然后将视图的高度设置为值1或更大.

或者可以使用以下代码以编程方式完成:

Objective-C的:

CGRect frame = CGRectZero;
frame.size.height = CGFLOAT_MIN;
[self.tableView setTableHeaderView:[[UIView alloc] initWithFrame:frame]];
Run Code Online (Sandbox Code Playgroud)

迅速:

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tableView.tableHeaderView = UIView(frame: frame)
Run Code Online (Sandbox Code Playgroud)

评论

正如其他人所说,你可以使用同样的解决方案来获取页脚.


来源和致谢

有关该属性的更多详细信息,请参阅文档tableHeaderView.

感谢@liushuaikobe使用最不正数的正常数字进行验证.

  • 一行解决方案 `self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, CGFLOAT_MIN)]` (3认同)
  • 在阅读滚动视图插图和默认contentEdgeInsets等约10个其他答案之后,这似乎是嵌入在UIViewController中的Grouped样式的最佳解决方案. (2认同)
  • 如果您调用 heightForHeaderInSection 不要返回零,否则上面的代码将不起作用 (2认同)

F. *_*les 13

Answer in Swift 4

如果在界面构建器中选择了表格视图并且在属性检查器中选择了样式“分组”,请在视图控制器中输入以下代码以修复额外的标题空间问题。

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNonzeroMagnitude
}
Run Code Online (Sandbox Code Playgroud)


小智 9

请按照以下步骤操作来拯救您的一天。

\n

从故事板中选择分组属性。

\n
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { \n     return CGFloat.leastNonzeroMagnitude \n}\n\nfunc tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { \n     return CGFloat.leastNonzeroMagnitude \n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果您使用的是 ios 15,也请执行此操作 \xe2\x80\x94

\n
if #available(iOS 15.0, *){ \n    self.tableViewSavedRecent.sectionHeaderTopPadding = 0.0 \n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • iOS 15.0 案例对我有用。谢谢。 (2认同)

Lan*_*son 6

对于 iOS 11.0+

tableView.contentInsetAdjustmentBehavior = .never
Run Code Online (Sandbox Code Playgroud)


Les*_*ary 5

单线解决方案:

目标C

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, CGFLOAT_MIN)];
Run Code Online (Sandbox Code Playgroud)

迅速

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: Double(FLT_MIN)))
Run Code Online (Sandbox Code Playgroud)


Mic*_*Mao 5

如果你的tableView的样式是UITableViewStyleGrouped,那么你必须注意SectionHeader或SectionFooter高度的委托,因为在这种情况下需要实现这一点。

返回值不应该为0,即使SectionHeader或SectionFooter的高度为0,它也需要是一个非常小的值;尝试CGFLOAT_MIN

以我为例:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
if (section == [self.dataArray indexOfObject:self.bannerList]) {
    return 46;
}
return CGFLOAT_MIN;
Run Code Online (Sandbox Code Playgroud)

}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
} 
Run Code Online (Sandbox Code Playgroud)

确保您实现了这两种方法,并且值正确,并且上边距将被固定。


Nil*_*wal 5

Leszek的回答很好。但是既然FLT_MINdeprecated,下面的代码会更好。并在viewDidLoad()方法中使用它。

迅速

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: Double(Float.leastNormalMagnitude)))
Run Code Online (Sandbox Code Playgroud)