如何在 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