我正在尝试使用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
我唯一的选择吗?
非常感谢!
答案 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就可以将单元格调整为文本字段大小。