我想在我的tableView中添加一个标题.此标题包含1个UILabel.标题高度应根据标签的行数计算.
在我的代码中,我添加了与标签<>的所有边缘的约束.头.这是我的尝试:
//Add header to tableView
header = UIView()
header.backgroundColor = UIColor.yellowColor()
tableView!.tableHeaderView = header
//Create Label and add it to the header
postBody = UILabel()
postBody.text = "The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog."
postBody.font = UIFont(name: "Lato-Regular",size: 16.0)
postBody.numberOfLines = 0
postBody.backgroundColor = FlatLime()
header.addSubview(postBody)
//Enable constraints for each item
postBody.translatesAutoresizingMaskIntoConstraints = false
header.translatesAutoresizingMaskIntoConstraints = false
//Add constraints to the header and post body
let postBodyLeadingConstraint = NSLayoutConstraint(item: postBody,attribute: NSLayoutAttribute.Leading,relatedBy: NSLayoutRelation.Equal,toItem: header,multiplier: 1,constant: 0)
postBodyLeadingConstraint.active = true
let postBodyTrailingConstraint = NSLayoutConstraint(item: postBody,attribute: NSLayoutAttribute.Trailing,constant: 0)
postBodyTrailingConstraint.active = true
let postBodyTopConstraint = NSLayoutConstraint(item: postBody,attribute: NSLayoutAttribute.Top,constant: 0)
postBodyTopConstraint.active = true
let postBodyBottomConstraint = NSLayoutConstraint(item: postBody,attribute: NSLayoutAttribute.Bottom,constant: 0)
postBodyBottomConstraint.active = true
//Calculate header size
let size = header.systemLayoutSizefittingSize(UILayoutFittingCompressedSize)
var frame = header.frame
frame.size.height = size.height
header.frame = frame
tableView!.tableHeaderView = header
header.layoutIfNeeded()
这是我的表:
let nib = UINib(nibName: "MessagesTableViewCell",bundle: nil)
let nibSimple = UINib(nibName: "SimpleMessagesTableViewCell",bundle: nil)
self.tableView!.registerNib(nib,forCellReuseIdentifier: "MessagesTableViewCell")
self.tableView!.registerNib(nibSimple,forCellReuseIdentifier: "SimpleMessagesTableViewCell")
self.tableView!.dataSource = self
self.tableView!.delegate = self
self.tableView!.rowHeight = UITableViewAutomaticDimension
self.tableView!.estimatedRowHeight = 100.0
self.tableView!.separatorStyle = UITableViewCellSeparatorStyle.None
self.tableView!.separatorColor = UIColor(hex: 0xf5f5f5)
self.tableView!.separatorInset = UIEdgeInsetsMake(0,0)
self.tableView!.clipsToBounds = true
self.tableView!.allowsSelection = false
self.tableView!.allowsMultipleSelection = false
self.tableView!.keyboarddismissMode = .OnDrag
你可以看到,标题没有考虑标签的高度(我做了numberOfLines = 0)
解决方法
UILabels利用UIView的intrinsicContentSize()来告诉自动布局应该是什么大小.然而,对于多行标签,内在内容大小是不明确的;桌子不知道它是否应该是短而宽,高和窄,或两者之间的任何东西.
为了解决这个问题,UILabel有一个名为preferredMaxLayoutWidth的属性.设置这个告诉一个多行标签,它最多应该是这个宽度,并允许intrinsicContentSize()找出并返回一个适当的高度来匹配.通过在示例中不设置preferredMaxLayoutWidth,标签将其宽度无限制,因此计算长单行文本的高度.
preferredMaxLayoutWidth唯一的复杂因素是,您通常不知道您希望标签的宽度,直到自动布局为您计算一个.因此,将视图控制器子类(看起来像代码示例可能来自)的位置在viewDidLayoutSubviews中:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
postBody.preferredMaxLayoutWidth = CGRectGetWidth(postBody.frame)
// then update the table header view
if let header = tableView?.tableHeaderView {
header.frame.size.height = header.systemLayoutSizefittingSize(UILayoutFittingCompressedSize).height
tableView?.tableHeaderView = header
}
}
显然,您需要为postBody标签添加一个属性才能使其工作.
让我知道,如果你不在这里的UIViewController子类,我会编辑我的答案.