Swift 更改UITableViewCell的intrinsicContentSize如何工作?

Swift 更改UITableViewCell的intrinsicContentSize如何工作?,swift,uitableview,autolayout,Swift,Uitableview,Autolayout,我制作了一个UITableView,其中的单元格在点击时会展开。它是根据以下项目建模的: 基本上,单元格的容器视图有两个子视图,它们充当展开/收缩状态的容器-“前”和“后”,每个子视图都被约束到单元格主内容视图的顶部、底部、前缘和后缘。要使单元格展开或收缩,我只需在前视图和后视图的底部约束上切换isActive属性。这是可行的,但前提是我在点击单元格时重新加载单元格。如果我只是更改约束,然后尝试调用invalidateIntrinsicContentSize(),则什么也不会发生 overrid

我制作了一个UITableView,其中的单元格在点击时会展开。它是根据以下项目建模的:

基本上,单元格的容器视图有两个子视图,它们充当展开/收缩状态的容器-“前”和“后”,每个子视图都被约束到单元格主内容视图的顶部、底部、前缘和后缘。要使单元格展开或收缩,我只需在前视图和后视图的底部约束上切换isActive属性。这是可行的,但前提是我在点击单元格时重新加载单元格。如果我只是更改约束,然后尝试调用invalidateIntrinsicContentSize(),则什么也不会发生

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {
        // Expand/contract the cell and invalidate size (doesn't work)
//        let cell = tableView.cellForRow(at: indexPath) as! ExpandingCell
//        cell.tap()
//        cell.invalidateIntrinsicContentSize()

        // Keep track of the selected index and configure the expand/contract state when the cell is remade
        tableView.deselectRow(at: indexPath, animated: false)
        expandedIndexPath = indexPath
        if(!expandedIndexPathArray.contains(indexPath)){
            expandedIndexPathArray.append(indexPath)
        }
        else{
            expandedIndexPathArray = expandedIndexPathArray.filter({$0 != indexPath})
        }

        // Whenever a cell's intrinsicContentSize changes, it must be reloaded
        tableView.reloadRows(at: [indexPath], with: .none)
    }

幕后发生了什么?为什么单元格不能在不重新加载的情况下重新计算其大小?

如果要根据其固有内容大小收缩/扩展单元格,需要执行以下3个步骤:

  • 配置表视图:

    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 44
    
    对于静态表视图控制器,您需要实现
    heightforrowatinexpath
    并返回
    UITableViewAutomaticDimension

  • 更新单元约束以反映收缩/扩展状态

  • 要求表视图反映更改:

    tableView.beginUpdates()
    tableView.endUpdates()
    

  • 亲爱的,我喜欢这比重新装手机要好得多。为什么BeginUpdate()/endUpdates()有效,而invalidateIntrinsicContentSize()无效?iOS 6中的自动布局引入了固有的内容大小。table view类早于此。它还通过自己的动画等批量更改。是否有关于使用自动布局调整单元格大小的过程的适当文档?我知道如何用自动布局制作细胞,并使其工作,但如果能理解其背后的机制,那就太好了。苹果的文档在某些方面有点蹩脚。据我所知不是这样。