header 部分高度在手动设置时不同

Section header height differs when set manually

我正在尝试更改 table 视图中特定部分 header 的高度。我用下面的代码进行了测试,只是为了了解 tableView(_:heightForHeaderInSection:) 是如何工作的。

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    print("DEBUG : ", section, tableView.sectionHeaderHeight)
    return tableView.sectionHeaderHeight
}

下面的调试打印显示该方法被多次调用,但 header 高度始终为 18.0(默认值)。

DEBUG :  4 18.0
DEBUG :  4 18.0
DEBUG :  0 18.0
DEBUG :  0 18.0
DEBUG :  1 18.0
DEBUG :  1 18.0
DEBUG :  2 18.0
...
DEBUG :  3 18.0

现在,一旦我使用 18.0 作为 return 的固定值(用于测试目的),table 视图的垂直延伸就会在视觉上被压缩,我认为这些部分靠得更近了,因此整个 UI 看起来不一样。似乎部分之间的 space 减少了,因为第一部分的 header(垂直)只有一半可见。

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    print("DEBUG : ", section, tableView.sectionHeaderHeight)
    return 18.0
}

这怎么可能?
可能是错误?

--- 更新 --- (13.06.2019)

我的问题是基于隐藏第 (2) 部分的意图,其中包括 header。我意识到 tableView.sectionHeaderHeight 是错误的 属性 使用。我应该使用 super.tableView(tableView, heightForHeaderInSection: section)

下面的代码可以正常工作:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if (section == 2) && myCondition {
        return CGFloat.leastNonzeroMagnitude
    }
    return super.tableView(tableView, heightForHeaderInSection: section)
}

不过,我不知道 18.0(见上文)来自哪里,因为我不使用 .xib 文件。

顺便说一句 super.tableView(tableView, heightForHeaderInSection: section) 总是 returns -1。我相信这会让 iOS 自行决定选择哪个高度。手动设置 18.0(用于测试)使 header 缩小,因为 iOS 为 header 高度选择的自动值更高。

我没有找到 属性 来打印这个值(必须在 30.0 左右 - 一个疯狂的猜测,仅此而已)。

根据您的代码,

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

您返回 sectionHeaderHeight 作为 header height 实际上意味着 UITableViewAutomaticDimension.

open var sectionHeaderHeight: CGFloat // default is UITableViewAutomaticDimension

根据 Apple,

This nonnegative value is used only if the delegate doesn’t implement the tableView:heightForHeaderInSection: method.

您在使用 print("DEBUG : ", section, tableView.sectionHeaderHeight) 时获得的值,即 18.0.xibcustom headerViewheight

您仍然得到正确的 UI,因为 iOS 自动在内部计算 header height runtime

这就是当您手动传递 18.0 作为 header height 时您的 header 缩小的原因。

如果您想为每个 section 使用单独的 header height,您需要在 tableView(_:heightForHeaderInSection:) 方法中传递 manually,即

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    switch section {
    case 0:
        return 50.0
    case 1:
        return 30.0
    default:
        return tableView.sectionHeaderHeight
    }
}

您可以根据需要在上述 switch statement 的基础上添加更多 cases。如果您对此仍有任何疑问,请告诉我。