我试图在UITableView中使用自动布局制作可变高度单元格。表格视图单元格有两个标签:标题标签和描述标签。
var viewBindingsDict: NSMutableDictionary = NSMutableDictionary()
viewBindingsDict.setValue(myTitleLabel, forKey: "label")
viewBindingsDict.setValue(myDescriptionLabel, forKey: "description")
let horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|-10-[label]-10-|", options: nil, metrics: nil, views: viewBindingsDict as [NSObject : AnyObject]) as [AnyObject]
let horizontalConstraints2 = NSLayoutConstraint.constraintsWithVisualFormat("H:|-10-[description]-10-|", options: nil, metrics: nil, views: viewBindingsDict as [NSObject : AnyObject]) as [AnyObject]
let verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|-10-[label]-5-[description]-10-|", options: nil, metrics: nil, views: viewBindingsDict as [NSObject : AnyObject]) as [AnyObject]
self.contentView.addConstraints(horizontalConstraints + horizontalConstraints2 + verticalConstraints)
在表视图控制器中,
self.tableView.estimatedRowHeight = 60
self.tableView.rowHeight = UITableViewAutomaticDimension
在表格视图的数据源
中override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! MyCell
// setup cell
cell.setNeedsUpdateConstraints()
cell.updateConstraintsIfNeeded()
return cell
}
这适用于大多数细胞,但总有一个或两个细胞未正确布置。例如,在这个test project中,第一行没有正确排列,但是当我滚动到底部(视图的第一行)时,然后向上滚动,它自己修复。我尝试使用两个XIB并以编程方式创建单元格。但没有运气。
有什么想法吗?请参阅test project以查看这种奇怪的行为。
答案 0 :(得分:0)
答案 1 :(得分:0)
显然,问题的真正根源是单元格的框架宽度在屏幕上显示之前未正确设置,即setupSubviews
总是以320分开始框架的宽度。由于表格视图在显示单元格之前计算行的高度,因此当应用程序在iPhone 6或6 plus中运行且宽度不是320点时,这会导致问题。所以我在MyCell
类的self.frame.size.width = UIScreen.mainScreen().applicationFrame.size.width
函数的开头添加了以下代码。
awakeFromNib
现在,只要显示表格视图,单元格就会以正确的高度显示。
为了在使用XIB时解决这个问题,我覆盖了override func awakeFromNib() {
super.awakeFromNib()
// we need to set the cell's width so that content view's width will be set correctly
self.frame.size.width = UIScreen.mainScreen().applicationFrame.size.width
}
class C extends B
{
public C(String s)
{
super(s);
...
}
}
如果有人感兴趣,我已更新了test project。