是否可以在UITableViewHeaderFooterView中使用多行textLabel(不使用自定义UILabel)?

时间:2015-01-12 12:45:31

标签: ios iphone uitableview swift

我正在尝试使用textLabel中的内置UITableViewHeaderFooterView,以便在UITableView的标题标题中显示标题。

这些标题的内容数量不详,因此需要涵盖多行。

如果这是一个表格单元格,那么myCell.numberOfLines = 0将起作用(以及estimatedHeightForRowAtIndexPath返回UITableViewAutomaticDimension)。但我无法得到任何与表头相似的内容。

我尝试在textLabel.numberOfLines = 0和/或viewForHeaderInSection中设置willDisplayHeaderView。我也尝试在我创建的自定义子类中设置标题正在使用(使用let sectionHeader = tableView.dequeueReusableHeaderFooterViewWithIdentifier("myIdentifier") as MyTableSectionHeaderSubclass设置)。在该子类中,我尝试在textLabel.numberOfLines = 0函数以及init

中设置layoutSubviews()

我已经通过计算文本字符串占用的空间量来设置每个标题的正确高度(使用CGSizeMake中的heightForHeaderInSection,可以提供有关此内容的更多信息救命)。因此,标签有足够的垂直空间可以扩展 - 它们只是卡在一条线上,文字被截断并以省略号结尾。

我正在尝试这种方法,以避免使用自定义UILabel来显示标题。虽然我可以通过这种方式应用多行,但这会带来其他问题,例如在添加或删除表行时标签位置/帧丢失。

是否有人知道UITableViewHeaderFooterView的内置textLabel是否可以使用多行文字?或者是自定义UILabel我唯一的选择吗?

非常感谢!

3 个答案:

答案 0 :(得分:0)

我认为使用自定义UILabel是一种更好的方法,因为您可以控制所有属性。

首先,一个方便的函数来计算UILabel的高度。 (以下是我特定项目的版本)。请注意,我设置了NSMutableParagraphStyle,我认为这是处理换行符,行间距等的最佳方法。

internal func heightForLabel(attributedString:NSMutableAttributedString, font:UIFont, width:CGFloat, lineSpacing: CGFloat) -> CGFloat{

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = lineSpacing

    let label:UILabel = UILabel(frame: CGRect(x:0, y:0, width:width, height:CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.font = font
    label.textAlignment = .left
    attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
    label.attributedText = attributedString
    label.sizeToFit()

    return label.frame.height
}

然后在视图控制器中,预先计算节标题高度

fileprivate let sectionHeaders = ["Header1", "Loooooooooooooooooooooong Header which occupies two lines"]
fileprivate var sectionHeaderHeights : [CGFloat] = []

override func viewDidLoad() {
        super.viewDidLoad()

        //Calculate the label height for each section headers, then plus top and down paddings if there is any. Store the value to `sectionHeaderHeights`
}

UITableViewDelegate方法

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return sectionHeaderHeights[section]
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let sectionHeader = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: sectionHeaderHeights[section]-paddings))
    sectionHeader.backgroundColor = .clear

    let sectionTitleLabel = UILabel()
    sectionTitleLabel.text = sectionTitles[section]
    sectionTitleLabel.font = UIFont(name: "GothamPro", size: 18)
    sectionTitleLabel.textColor = .black
    sectionTitleLabel.backgroundColor = .clear
    sectionTitleLabel.frame = CGRect(x: padding, y: sectionHeader.frame.midY, width: sectionTitleLabel.frame.width, height: sectionTitleLabel.frame.height)
    sectionHeader.addSubview(sectionTitleLabel)

    return sectionHeader
}

答案 1 :(得分:0)

在Interface Builder中将标签放在原型单元格上方。在“属性检查器”中,设置行数= 0,换行到换行并输入文本。

答案 2 :(得分:-2)

使用这个:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension

请注意,自动调整仅适用于:

lineBreakMode="tailTruncation" 
numberOfLines="0"

您可以确保在单元格内部将contentView约束设置为与文本字段相关的顶部,左侧,底部,右侧。

这样iOS就可以将单元格调整为文本字段大小。