UITableView节标题自动高度未正确更新

时间:2017-05-16 15:40:21

标签: ios uitableview uitableviewsectionheader uitableviewautomaticdimension

我遇到了自动/动态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()无济于事。任何建议都将不胜感激。

以下是应用中所见行为的屏幕截图。第一部分是截止的,第二部分太高了:

enter image description here

6 个答案:

答案 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仅在您使用titleForHeaderInSectiontitleForFooterInSection

提供节标题时使用