UITableView:如何调整包含自动换行标签的标头

时间:2015-10-04 01:43:46

标签: ios swift uitableview tableheader

UITableView中的标题包含一个自动换行的标签,该标签可以包含0到4行的可变文本。

出于这个原因,我无法使用此函数预先确定标题高度:

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

是否可以以某种方式让标题自行调整大小?

1 个答案:

答案 0 :(得分:3)

自动调整大小

如果您正在使用自动布局,则可以为UITableView创建自动调整单元格/页眉/页脚,如下所示:

<强>细胞

tableView.estimatedRowHeight = 68.0
tableView.rowHeight = UITableViewAutomaticDimension

<强>接头

tableView.estimatedSectionHeaderHeight = 68.0
tableView.sectionHeaderHeight = UITableViewAutomaticDimension

<强>页脚

tableView.estimatedSectionFooterHeight = 68.0
tableView.sectionFooterHeight = UITableViewAutomaticDimension

如果您想动态计算估计的身高,也可以使用UITableViewDelegate方法estimatedHeightForHeaderInSection。例如:

func tableView(tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
        let calculatedHeight = estimatedHeaderHeightCalculator(section: section)
        return calculatedHeight
  }

计算

我通常会跳过自动调整并手动计算单元格的大小。动态地自动化细胞是挑剔的,花费我的一天改变拥抱/压缩约束是我的地狱的想法。

如果您知道相关字符串,请计算大小如下:

extension: String {

    func heightWithConstrainedWidth(width: CGFloat, font: UIFont) -> CGFloat {
        let constraintRect = CGSize(width: width, height: CGFloat.max)
        let boundingBox = self.boundingRectWithSize(constraintRect, options: [.UsesLineFragmentOrigin, .UsesFontLeading], attributes: [NSFontAttributeName: font], context: nil)
        return boundingBox.height
    }

}

然后在UITableViewDelegateMethod

    func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        let constrainingWidth = tableView.bounds.width
        let font = UIFont(name: "YourHeaderLabelFont", size: 16)!

        let headerString = yourHeaderString
        let heightForString = headerString.heightWithConstrainedWidth(constrainingWidth, font: font)

        return heightForString
    }

请注意,字符串的计算高度,您可能需要添加一些填充。