如何在 iOS 11 中隐藏部分标题?

Posted

技术标签:

【中文标题】如何在 iOS 11 中隐藏部分标题?【英文标题】:How can I hide section headers in iOS 11? 【发布时间】:2017-10-05 20:51:06 【问题描述】:

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
    

【问题讨论】:

您是否可能实现 heightForHeaderInSection 或 viewForHeaderInSection?这可能会使您的部分出现或不出现。苹果文档还说关于 titleForHeaderInSection “返回值:用作部分标题标题的字符串。如果您返回 nil ,则该部分将没有标题。”不是说没有章节,只是没有标题。 【参考方案1】:

在 iOS 11 中,如果您只实现 titleForHeaderInSection 并返回 nil,您将看不到标题视图。但是如果你也实现viewForHeaderInSection,不管你返回什么,都会有一个section。

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

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 将显示节标题。

【讨论】:

哇。这似乎是一个重大错误。 它看起来更像是一个错误而不是一个功能:)【参考方案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

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

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

“CALayerInvalidGeometry”类型的 NSException

如果您在if 语句中使用return 0,则不会发生此崩溃! :)

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

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

    return tableView.sectionHeaderHeight

【讨论】:

返回 0 会导致 UITableView 使用默认值。这是未记录的行为。如果您返回一个非常小的数字,您实际上会得到一个高度为零的标题。 这不是我的经验。我的经验是返回 0 会抑制标题。 它可能在最近的 iOS 版本中发生了变化,但这绝对是过去的一个问题。它还可能取决于您是否使用分组的 UITableView。 ***.com/questions/17699831/… 好吧,我绝对不是在谈论分组表视图。 嗯,这是一种常见的类型,所以它可能与其他类型有关。【参考方案3】:

实现tableView(_:heightForHeaderInSection:) 以返回UITableViewAutomaticDimension

这将在 titleForHeaderInSection 返回 nil 的情况下抑制节标题(否则它将使用表中的默认标题高度)。

【讨论】:

【参考方案4】:

如果您明确告诉 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 来确定是否显示节标题。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

viewForHeaderInSection返回空视图

【讨论】:

【参考方案7】:

swift 3、4 和 4.2

隐藏你的 tableView 标题

tableView.tableHeaderView?.frame = CGRect.zero

并展示它

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

【讨论】:

【参考方案8】:

什么对我有用:

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

【讨论】:

以上是关于如何在 iOS 11 中隐藏部分标题?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 11 和 iPhone X 上实现隐藏 UITabBar 以显示 UIToolbar

如何隐藏大标题 iOS 11 搜索控制器

如何在xamarin表单ios中隐藏标签栏导航标题

使用ios 8 UISearchController单击搜索栏时如何隐藏部分标题?

如何在 CMake 中隐藏某些目标?

如何在 iOS 7 中隐藏状态栏?