【问题标题】:iOS UITableView Hide Header SpaceiOS UITableView 隐藏标题空间
【发布时间】:2014-08-05 15:53:54
【问题描述】:

在视图控制器中,我只有一个 UITableView。在 IB 中,我将页眉和页脚高度设为 1,并且还添加了以下代码,但在第一个单元格上方,它们有很多页眉空间。我想摆脱那个空间。甚至滚动条也从第一个单元格开始,而不是在顶部。

-(CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
CGFloat height = 0.0001;
return height;
}

-(CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
CGFloat height = 0.0001;
return height;
}

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
// Create Empty View
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width,
                                                        [self tableView:self.visitorlistsTv heightForHeaderInSection:section]) ];
return view;
}

-(UIView *) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
// Create Empty View
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width,
                                                        [self tableView:self.visitorlistsTv heightForFooterInSection:section]) ];
return view;

}

使用上面的代码,页脚部分被隐藏了。但也无法隐藏标题。

查看解决方案的其他链接我还在视图中添加了 TableView,向 tableview 添加了约束,但标题部分仍然是他们的。

我哪里错了?如何摆脱它?

【问题讨论】:

  • 为什么需要高度这么小的页眉和页脚?这看起来像一个非常糟糕的黑客。你想解决什么问题?
  • 我读到返回 0 高度没有任何区别,因此我尝试返回这么小的标题。在第一个单元格上方的表格顶部,它们是空白空间,我想删除该空间。

标签: ios objective-c uitableview


【解决方案1】:

如果您想删除UITableView 上方的空格,请尝试更改它的contentInset 属性,而不是使用小height 制作自定义标题:

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

您可能需要调整第一个数字以将其调整为您的特定视图场景。

了解这也是一种解决方法 (source),但它比创建自定义表格视图标题更简洁。

【讨论】:

  • 感谢工作。我已经添加了该行,我将第 1 段更改为 -20,然后可以看到更改。我必须到 -60 才能完全删除它。知道为什么以及这个空间是什么吗?
  • 我的表格也没有分组 - IB 中的样式是普通的而不是分组的。
【解决方案2】:

我对此有另一种解决方案(在 iOS 10 上进行了检查),对我来说,接受的解决方案不起作用。

在我的例子中,我有可变高度的部分标题,因此第一部分返回 0 高度是不可接受的。我使用了分组表格样式,因为我也需要分隔符来框出部分标题。

解决方案: 确保你的代码中没有这样的东西:

self.table.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

我用它来删除空行的分隔符,但分组样式是不必要的。

我知道这对你们所有人来说都不是这样,但它可能对我这种情况有所帮助。

【讨论】:

    【解决方案3】:

    在我看来,这里的问题是您根本不想要页眉/页脚。如果是这种情况,您不想在页眉/页脚中返回任何视图。我建议要么在 viewForHeader/Footer 中返回 nil,要么完全不实现这些功能 - 它们是可选的。

    【讨论】:

    • 是的,我完全不想要页眉/页脚。但是在 height/viewFor 方法中不实现或返回 0 和 nil 对标题没有任何影响。使用页脚它可以工作。对于 Header,其唯一设置 contentInset 有效。标题部分没有任何效果。
    • 我会尝试从代码中完全删除这些,也许尝试在 IB 中修复?
    • 我完全同意你的看法。我也试过这样。花了这么多时间,我在这里问。
    【解决方案4】:

    使用导航栏,您可以更改顶部值

    self.tableView.contentInset =UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)
    

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

    【讨论】:

      【解决方案5】:

      如果你想避免设置硬编码的高度,你可以从你的第一个单元格 Y 位置设置 contentOffset 顶部,如下所示:

      - (void)viewDidLayoutSubviews
      {
        UITableViewCell *firstCell = (self.tableView.visibleCells.count > 0?self.tableView.visibleCells[0]:nil);
      
        [super viewDidLayoutSubviews];
      
        // Get rid of the defaut header height.
        self.tableView.contentInset = UIEdgeInsetsMake(-firstCell.frame.origin.y, 0, 0, 0);
      }
      

      【讨论】:

        【解决方案6】:

        使用此代码删除 uitableview 的第一个单元格之间的空间。

        - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
         {
            return 0.002f;// set this...
         }
        

        【讨论】: