包含 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)的主要内容,如果未能解决你的问题,请参考以下文章

从 UItableview 删除一行时崩溃

iOS开发UI篇—UITableview控件使用小结

UINavigationController 如何成为 UITableView 的 navigationController?

刷新 UITableView 而不刷新节标题

UITableView API大百科

以编程方式添加带有自动布局的 UITableView