从iOS7开始,在我的UITableView顶部有额外的空间它有一个UITableViewStyleGrouped样式。

这里有一个例子:

tableview从第一个箭头开始,有35个像素的无法解释的填充,然后绿色的头是一个由viewForHeaderInSection返回的UIView(其中section为0)。

有人能解释一下这个35像素的数量是从哪里来的吗?我如何才能在不切换到UITableViewStylePlain的情况下摆脱它?


更新(回答):

在iOS 11及更高版本中:

tableView.contentInsetAdjustmentBehavior = .never

当前回答

当使用分组TableView时,使用这个来避免viewWillAppear中的边界切割

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);

其他回答

这是在iOS 11和Xcode 9.1中通过Storyboard轻松修复的方法:

Select Table View > Size Inspector > Content Insets: Never

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 0.0
}

这对我很管用。也可以根据section给出标题的高度。

2019答:

你只要这样做

tableView.contentInsetAdjustmentBehavior = .never

奇怪微妙的gotchya ->

现在表视图有一个非常奇怪的行为:

在有缺口(XR等)的设备上,它不会告诉你添加更多的插入,但只有当表格从屏幕的物理顶部开始时才会这样做。 如果你不是从屏幕顶部开始,它不会那样做,但是 这两种情况都是>>与safeAreaInsets .......无关这很让人困惑

所有这些都是完全没有记录的……你可以浪费几个小时来解决这个问题。

如果你确实需要从屏幕/表格的顶部开始测量,

事实上,简单地说:

tableView.contentInsetAdjustmentBehavior = .never

一个很好的例子是,当你在一个表格的顶部添加一些横幅或类似的东西时,这是现在很常见的,你只需要将表格的顶部插入设置为你的横幅/等在运行时的任何高度。

要做到这一点,必须使用

tableView.contentInsetAdjustmentBehavior = .never

电话:/

奖金陷阱

不要忘记,现在几乎总是动态加载一些信息(用户图片、描述等等),所以在信息到达之前不能将这些值设置为最终需要的值。另一个gotchya。:/

所以你会有这样的代码:

func setTableOffsetOnceFlagAreaSizeIsKnown() {
    tableView.contentInset.top = yourSpecialFlagViewUpTop.bounds.height
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    setTableOffsetOnceFlagAreaSizeIsKnown()
}

在我的例子中,在Storyboard的原型可视化中有一个不需要的名为HeaderView的单元格,当我删除它时,一切都很好。

如果你选择UITableViewStyleGrouped的样式,你需要实现Header和Footer高度委托方法,并且返回值需要大于0;是这样的:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return CGFLOAT_MIN;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return CGFLOAT_MIN;
}