115

由于使用分组样式的表格视图设计在 iOS 7 中发生了很大变化,我想隐藏(或删除)第一节标题。到目前为止,我还没有设法实现它。

稍微简化一下,我的代码如下所示:

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (section == 0)
        return 0.0f;
    return 32.0f;
}

- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        UIView* view = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 640.0f, 0.0f)];
        return view;
    }
    return nil;
}

- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        return nil;
    } else {
        // return some string here ...
    }
}

如果我返回 0 的高度,则永远不会使用节索引 0 调用其他两个方法。然而,仍然使用默认高度绘制一个空的节标题。(在 iOS 6 中,这两个方法都被调用了。但是,可见的结果是一样的。)

如果我返回不同的值,节标题将获得指定的高度。

如果我返回 0.01,那几乎是正确的。但是,当我在模拟器中打开“颜色未对齐的图像”时,它会标记所有表格视图单元格(这似乎是一个合乎逻辑的结果)。

UITableView: hide header from empty section问题的答案似乎表明有些人成功隐藏了部分标题。但它可能适用于普通样式(而不是分组样式)。

到目前为止,最好的折衷方案是返回高度 0.5,从而在导航栏下方产生一条较粗的线。但是,如果有人知道如何完全隐藏第一节标题,我将不胜感激。

更新

根据caglar的分析(https://stackoverflow.com/a/19056823/413337),只有当表格视图包含在导航控制器中时才会出现问题。

4

16 回答 16

158

我有一个对我来说似乎相当干净的解决方法。所以我在回答我自己的问题。

由于 0 作为第一节标题的高度不起作用,所以我返回 1。然后我使用contentInset将该高度隐藏在导航栏下方。

目标-C:

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (section == 0)
            return 1.0f;
    return 32.0f;
}

- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        return nil;
    } else {
        // return some string here ...
    }
}

- (void) viewDidLoad
{
    [super viewDidLoad];

     self.tableView.contentInset = UIEdgeInsetsMake(-1.0f, 0.0f, 0.0f, 0.0);
}

迅速:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return section == 0 ? 1.0 : 32
}

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.contentInset = UIEdgeInsets(top: -1, left: 0, bottom: 0, right: 0)
}
于 2013-09-27T19:41:07.270 回答
54

这是如何隐藏 UITableView 中的第一节标题(分组样式)。

Swift 3.0 & Xcode 8.0 解决方案

  1. TableView 的委托应该实现 heightForHeaderInSection 方法

  2. 在 heightForHeaderInSection 方法中,返回最小的正数。(不是零!)

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    
        let headerHeight: CGFloat
    
        switch section {
        case 0:
            // hide the header
            headerHeight = CGFloat.leastNonzeroMagnitude
        default:
            headerHeight = 21
        }
    
        return headerHeight
    }
    
于 2016-12-05T12:41:57.603 回答
36

答案对我和我的团队来说很有趣,而且工作起来很迷人

  • 在 Interface Builder 中,只需将 tableview 移动到视图层次结构中的另一个视图下。

原因:

我们观察到这种情况仅发生在 View Hierarchy 中的第一个 View 上,如果这个第一个视图是 UITableView 的话。所以,所有其他类似的 UITableView 都没有这个烦人的部分,除了第一个。我们尝试将 UITableView 移出视图层次结构的第一位,并且一切都按预期工作。

于 2013-12-11T11:27:47.093 回答
25

将此技巧用于分组类型 tableView

在viewDidLoad方法中为您的表格视图复制粘贴以下代码:

tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tableView.bounds.size.width, 0.01f)];
于 2015-04-30T13:47:17.703 回答
22

这种方式是可以的。

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return CGFloat.min
    }
    return 25
}

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if section == 0 {
        return nil
    }else {
        ...
    }
}
于 2015-03-31T02:23:01.417 回答
6

我刚刚复制了您的代码并尝试了。它运行正常(在模拟器中尝试过)。我附上了结果视图。你想要这样的观点,对吧?还是我误解了你的问题?

在此处输入图像描述

于 2013-09-27T17:36:53.957 回答
6

Swift3:heightForHeaderInSection 与 0 一起使用,您只需确保将 header 设置为 clipsToBounds。

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

如果您不设置 clipsToBounds 隐藏标题将在滚动时可见。

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }

    header.clipsToBounds = true
}
于 2017-07-30T13:06:44.050 回答
5

更新 [9/19/17]:旧答案在 iOS 11 中不再适用于我。感谢 Apple。以下做了:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 20.0f;
self.tableView.contentInset = UIEdgeInsetsMake(-18.0, 0.0f, 0.0f, 0.0);

上一个答案:

正如Chris Ostomo在评论中发布的那样,以下内容对我有用:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return CGFLOAT_MIN; // to get rid of empty section header
}
于 2017-09-14T22:07:06.340 回答
5

以下是如何在 Swift 中删除分组 UITableView 中的顶部部分标题:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))
于 2018-07-02T16:42:32.457 回答
3

在 Swift 4.2 和许多早期版本中,您可以将其他标题设置为nil. 假设您有两个部分,并且只希望第二个部分(即1)具有标题。该标题将包含文本Foobar

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return section == 1 ? "Foobar" : nil
}
于 2018-08-01T01:55:53.910 回答
3

如果您想完全删除所有部分标题,请尝试此操作

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

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}
于 2019-05-22T07:19:18.150 回答
1

在 iOS 15 中,此代码删除了不需要的节标题空间。

 if #available(iOS 15.0, *) {
  tableView.sectionHeaderTopPadding = .leastNormalMagnitude
}
于 2021-10-22T00:23:55.527 回答
0

我还不能发表评论,但我想我会补充一点,如果你UISearchController的控制器上有一个UISearchBaras your tableHeaderView,那么将第一部分的高度设置为 0 inheightForHeaderInSection确实有效。

我使用self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height);的是默认情况下隐藏搜索栏。

结果是第一部分没有标题,向下滚动将在第一行上方显示搜索栏。

于 2015-10-15T22:25:55.697 回答
0

到目前为止最简单的方法是返回nil,或者""func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?您不希望显示标题的部分中。

于 2017-08-07T15:14:57.430 回答
0

Swift 版本:Swift 5.1
大多数情况下,您可以像这样在 tableView 委托中设置高度:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
   return UIView(frame: CGRect(x: 0, y: 0, width: view.width, height: CGFloat.leastNormalMagnitude))
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
   return CGFloat.leastNormalMagnitude
}

有时当你用 Xib 或 Storyboard 创建 UITableView 时,up 的答案不起作用。您可以尝试第二种解决方案:

let headerView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))
self.tableView.tableHeaderView = headerView

希望这对你有用!

于 2020-03-24T06:01:46.963 回答
0

以下内容适用于我在 iOS 13.6 和 Xcode 11.6UITableViewController中嵌入的 a UINavigationController

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    nil
}

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    .zero
}

不需要其他诡计。不使用overridea 时不需要关键字UITableViewController(即刚刚实现UITableViewDelegate方法时)。当然,如果目标只是隐藏第一节的标题,那么这个逻辑可以被包装在一个条件中,如下所示:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if section == 0 {
        return nil
    } else {
        // Return some other view...
    }
}

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return .zero
    } else {
        // Return some other height...
    }
}
于 2020-08-18T16:43:06.883 回答