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

时间:2013-09-27 17:09:41

标签: ios uitableview ios7

由于使用分组样式的表格视图设计在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),只有在表视图包含在导航控制器中时才会出现问题。

14 个答案:

答案 0 :(得分:140)

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

由于第一节标题的高度不起作用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)
}

答案 1 :(得分:36)

答案对我和我的团队来说非常有趣,并且像魅力一样工作

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

<强>原因:

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

答案 2 :(得分:23)

将此技巧用于分组类型tableView

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

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

答案 3 :(得分:18)

这种方式还可以。

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

答案 4 :(得分:6)

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

enter image description here

答案 5 :(得分:5)

Swift3:heightForHeaderInSection与0一起使用,你只需要确保标题设置为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
}

答案 6 :(得分:5)

更新[9/19/17]:旧答案在iOS 11中不再对我有用。感谢Apple。以下是:

/final

上一个答案:

正如Chris Ostomo的评论中所述,以下内容对我有用:

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

在Swift 4.2和许多早期版本中,不必像其他答案中那样将第一个标头的高度设置为0,而是可以将其他标头设置为nil。假设您有两个部分,并且只希望第二个部分(即1)具有标题。该标题将带有文本 Foobar

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return section == 1 ? "Foobar" : nil
}

答案 9 :(得分:0)

我无法发表评论,但我想补充一点,如果您的控制器上有一个void PathInit(Path *P, int vsize){ P = (Path *)malloc(sizeof(Path)); /* Remove this line */ UISearchController作为UISearchBar,请将第一部分的高度设置为tableHeaderView中的0确实有用。

我使用heightForHeaderInSection,以便默认隐藏搜索栏。

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

答案 10 :(得分:0)

到目前为止,

最简单的方法是在def digit_sum(n): s=0 while(n>0): r=n%10 n=n/10 s=s+r return s print digit_sum(0123) 中为nil返回您不希望显示标题的部分。

答案 11 :(得分:0)

如果要完全删除所有节标题,请尝试此操作

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

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

答案 12 :(得分: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

希望它对您有用!

答案 13 :(得分:0)

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

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

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

无需其他技巧。当不使用override时(即刚实现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...
    }
}