包含 UITableView 的 UITableViewCell 的高度(iOS8 和 AutoLayout)
Posted
技术标签:
【中文标题】包含 UITableView 的 UITableViewCell 的高度(iOS8 和 AutoLayout)【英文标题】:Height for UITableViewCell containing UITableView (iOS8 and AutoLayout) 【发布时间】:2014-09-29 08:40:42 【问题描述】:我有一个带有自定义单元格的 UITableView,其中也包含 UITableViews。我在获取这些单元格的高度时遇到问题。
我在 heightForRowAtIndexPath 中获取高度,为此我填充子 tableView(在单元格内)并调用 layoutIfNeeded。这给了我这个 tableView 的正确 contentSize。问题是单元格的整体大小是错误的并且不会改变。所以调用 cell.bounds.height 会返回一个不正确的值。
let cell:GroupCell = tableView.dequeueReusableCellWithIdentifier("GroupCell") as GroupCell
cell.configure(field as SingleField, delegate: self) // populates data
cell.tableView.layoutIfNeeded()
// cell.tableView.contentSize is correct
return cell.bounds.height // is wrong - bounds haven't changed
谁能指出我正确的方向?顺便说一句 - 我只针对 ios8。
【问题讨论】:
【参考方案1】:尝试创建 UITableViewCell 的子类,添加 TableView 代理,像往常一样使用它。
【讨论】:
感谢 Dmitry,我的自定义单元格已经这样做了。问题是父 UITableView 无法获得此单元格的正确大小。【参考方案2】:我认为问题出在 UITableView 中。你有悲伤的表有正确的内容大小,但它有不正确的大小。计算正确的内容大小后,您应该手动更改 tableView 高度。我想它会对你有所帮助。提示:您可以观察 contentSize 属性,每次更改时您都可以调整表格视图的大小。为此 - 以低优先级(例如 750)向您的表格添加高度约束,而不是在需要时更改它。在这种情况下,您的表格将具有内容大小和 self.frame.heigh 相等。
【讨论】:
感谢 Seliver,有趣的角度。我可以计算标签、边距等的大小并将它们添加到 tableview 内容大小。我希望在自动布局约束下这会自动发生。【参考方案3】:我设法解决了这个问题:
-
我在 UITableView(单元格内)上设置了高度约束(大于或等于)。我将它的优先级设置为高
我将下边距的优先级设置为低
在配置我的自定义单元格时,我调用了 setNeedsUpdateConstraints(),它通过删除高度约束使其无效,然后在重新添加之前根据表格视图的内容大小重新计算它。
最后,在 heightForRowAtIndexPath cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height 现在返回正确的高度
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
let field = fields[indexPath.row]
let cell:GroupCell = tableView.dequeueReusableCellWithIdentifier("GroupCell") as GroupCell
cell.configure(field as SingleField, delegate: self)
return cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
func configure(field:SingleField,delegate:GroupDelegate)
self.field = field
self.delegate = delegate
nameLabel.text = field.name
tableView.reloadData()
setNeedsUpdateConstraints()
override func updateConstraints()
tableView.removeConstraint(tableViewHeightConstraint)
tableViewHeightConstraint = NSLayoutConstraint(item: tableView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: tableView.contentSize.height)
tableView.addConstraint(tableViewHeightConstraint)
super.updateConstraints()
【讨论】:
以上是关于包含 UITableView 的 UITableViewCell 的高度(iOS8 和 AutoLayout)的主要内容,如果未能解决你的问题,请参考以下文章
UINavigationController 如何成为 UITableView 的 navigationController?