如何在iOS 11中隐藏节标题?

时间:2017-10-05 20:51:07

标签: ios swift uitableview

在iOS 11中,无论项目是否为0,我的部分标题始终显示。

在iOS 10设备上,当项目数为0时,我的代码可以工作,部分会消失。但是在iOS 11上,相同的代码没有任何影响。

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    if sections[section].items.count > 0{
        return sections[section].title
    }else{
        return nil
    }
}

8 个答案:

答案 0 :(得分:6)

在iOS 11中,如果仅实现titleForHeaderInSection并返回nil,则不会看到标题视图。但是如果你也实现viewForHeaderInSection,无论你返回什么,都会有一个部分。

仅此一项不会显示章节标题:

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return nil
}

这将显示没有标题的节标题:

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return nil
}

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

因此两个方法都可以返回nil并且标题将是可见的。如果仅实施titleForHeaderInSection,则不会显示任何标头。这似乎只是在iOS 11中的情况。不确定它是否是一个错误或强迫开发人员选择两者中的一种方法的方法。但是文档证实了这种关于titleForHeaderInSection的行为:

  

"返回值:用作节标题标题的字符串。如果您返回nil,则该部分将没有标题。"

所以没有显示或不显示,此方法仅返回标题的字符串。这是有道理的。但看起来像一个错误的是viewForHeaderInSection中返回nil将显示节标题。

答案 1 :(得分:2)

要隐藏第0节的节标题,请执行以下方法:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if (section == 0) {
        return CGFloat.leastNormalMagnitude //Now section 0's header is hidden regardless of the new behaviour in iOS11.
    }

    return tableView.sectionHeaderHeight
}

此解决方案也适用于分组的UITableViews,如下所述。

更新:如果执行reloadSections(..),此解决方案会导致

  

NSException类型' CALayerInvalidGeometry'

但是,return 0声明中的if,此次崩溃并未发生! :)

因此,我会说我找到的最佳解决方案(至少为普通UITableViews)是:

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

    return tableView.sectionHeaderHeight
}

答案 2 :(得分:0)

实施UITableViewAutomaticDimension以返回titleForHeaderInSection

这将完全取消nil返回Main的情况下的节标题(否则它将使用表中的默认标题高度)。

答案 3 :(得分:0)

如果您明确告诉iOS 11在heightForHeaderInSection中使用高度为0,则会隐藏节标题。您仍然可以通过返回UITableViewAutomaticDimension非零高度标头来使用自动标头大小调整。以下是解决iOS 11错误的解决方案示例:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
  guard shouldShowSectionHeader(section: section) else { return 0 }
  return UITableViewAutomaticDimension
}

您需要实施shouldShowSectionHeader以确定是否显示标题标题。

答案 4 :(得分:0)

iOS 11.3,适用于制作

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

    return sections[section].headerViewModel?.makeView(bindImmediately: true)
}

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

    return sections[section].headerViewModel == nil ? 0 : UITableViewAutomaticDimension
}

答案 5 :(得分:0)

viewForHeaderInSection返回空视图

答案 6 :(得分:0)

交换3、4和4.2

隐藏tableView标头

tableView.tableHeaderView?.frame = CGRect.zero

并显示回去

tableView.tableHeaderView?.frame = CGRect(x: 0, y: 0, width: tableView.frame.width, height: 66)

答案 7 :(得分:0)

对我有用的东西

  Pig littlePiggy;
  s.add_animal(&littlePiggy); //< Warning! taking address of temp var.