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
是 .xib
中 custom headerView
的 height
。
您仍然得到正确的 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
。如果您对此仍有任何疑问,请告诉我。
我正在尝试更改 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
是 .xib
中 custom headerView
的 height
。
您仍然得到正确的 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
。如果您对此仍有任何疑问,请告诉我。