我遇到了自动/动态UITableView节头视图的问题,其中包含一个包裹的UILabel( numberOfLines = 0 )。高度未正确计算,尤其是在滚动表格并重新使用视图后。有时UILabel包裹,有时它被截断,有时一个或多个标签不可见,有时标签之间有额外的间距。自定义视图包含一个带有三个UILabel的垂直UIStackView,其中一个包装。
可以在https://github.com/outerstorm/tableviewHeaderTest找到展示该问题的完整示例应用。
使用以下内容在viewDidLoad中将节标题高度设置为自动:
tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = 30.0
并且还实现了以下heightForHeaderInSection,试图让它工作:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return UITableViewAutomaticDimension
}
我也尝试在各个点调用 setNeedsLayout()和 layoutIfNeeded()无济于事。任何建议都将不胜感激。
以下是应用中所见行为的屏幕截图。第一部分是截止的,第二部分太高了:
答案 0 :(得分:2)
只需添加estimatedHeightForHeaderInSection
功能并返回您的估计身高。它将解决您的问题。从here
func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat
{
return 30;
}
答案 1 :(得分:1)
一般
heightForHeaderInSection
总是在之前调用
viewForHeaderInSection
使用UITableViewAutomaticDimension时,除非手动调用tableview.reloadData(),否则sectionheader高度只计算一次。
在代码中,您每次都会更改sectionheader文本。高度是第一次计算,并没有自动改变。
您可以将setup func更改为:
func setup(someNum: Int) {
let text = String(repeating: "This is where the really long text goes so that it will wrap lines appropriately", count: someNum)
mainLabel.text = text
}
并将节索引传递给函数
答案 2 :(得分:1)
我最近遇到过这种问题。
我通过设置多行标签的preferredMaxLayoutWidth
来解决它,即
在标签中设置值之前,请将preferredMaxLayoutWidth
设置为:
self.label1.preferredMaxLayoutWidth = self.label1.frame.size.width
self.label2.preferredMaxLayoutWidth = self.label2.frame.size.width
self.label3.preferredMaxLayoutWidth = self.label3.frame.size.width
答案 3 :(得分:1)
变通方法可以将标题视图保存在数组中,然后从估计高度方法返回视图高度
for _ in 0 ..< data.count {
let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "CustomHeaderView") as! CustomHeaderView
view.setup()
headerViews.append(view)
}
func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat
{
let view = headerViews[section] as? UIView
return (view?.frame.size.height)!
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
return headerViews[section] as? UIView
}
答案 4 :(得分:0)
添加self.label1.preferredMaxLayoutWidth = self.label1.frame.size.width
self.label1.numberoflines = 0;
self.label1.linebreakmode = NSLineBreakByWordWrapping;
在awakeFromNib方法中
要么
请在https://github.com/krishnasolankiD/multiLineLabel
答案 5 :(得分:0)
从代码的文档中:
// Returning this value from tableView:heightForHeaderInSection: or tableView:heightForFooterInSection: results in a height that fits the value returned from
// tableView:titleForHeaderInSection: or tableView:titleForFooterInSection: if the title is not nil.
换句话说。 UITableViewAutomaticDimension
仅在您使用titleForHeaderInSection
或titleForFooterInSection