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

由于使用分组样式的表格视图的devise在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,那几乎是正确的。 但是,当我在模拟器中打开“颜色未alignment的图像”时,它会标记所有的表格视图单元格(这似乎是合乎逻辑的结果)。

UITableView的问题的答案:从空白部分隐藏标题似乎表明,有人成功隐藏部分标题。 但它可能适用于朴素风格(而不是分组风格)。

到目前为止,最好的折衷办法是返回0.5的高度,导致导航栏下面有一些粗糙的线条。 不过,如果有人知道第一部分的标题可以完全隐藏,我将不胜感激。

更新

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

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

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

 - (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); } 

答案对我和我的团队来说非常有趣, 而且像一个魅力

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

原因:

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

使用这个技巧分组typestableView

viewDidLoad方法中复制下面代码中的表格视图粘贴:

 tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tableView.bounds.size.width, 0.01f)]; 

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

Swift 3.0和Xcode 8.0解决scheme

  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 } 

这样可以。

 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 { ... } } 

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

在这里输入图像说明

更新[9/19/17]:旧的答案不适用于我在iOS 11中。谢谢苹果。 以下是:

 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 } 

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 } 

我还不能发表评论,但认为我会补充说,如果你的控制器上有一个UISearchControllerUISearchBar作为你的tableHeaderView ,那么在heightForHeaderInSection中将第一部分的高度设置为0确实有效。

我使用self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height); 这样search栏默认是隐藏的。

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

最简单的是返回nil ,或""func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 对于您不希望显示标题的部分。