Swift 更改UITableViewCell的intrinsicContentSize如何工作?
我制作了一个UITableView,其中的单元格在点击时会展开。它是根据以下项目建模的: 基本上,单元格的容器视图有两个子视图,它们充当展开/收缩状态的容器-“前”和“后”,每个子视图都被约束到单元格主内容视图的顶部、底部、前缘和后缘。要使单元格展开或收缩,我只需在前视图和后视图的底部约束上切换isActive属性。这是可行的,但前提是我在点击单元格时重新加载单元格。如果我只是更改约束,然后尝试调用invalidateIntrinsicContentSize(),则什么也不会发生Swift 更改UITableViewCell的intrinsicContentSize如何工作?,swift,uitableview,autolayout,Swift,Uitableview,Autolayout,我制作了一个UITableView,其中的单元格在点击时会展开。它是根据以下项目建模的: 基本上,单元格的容器视图有两个子视图,它们充当展开/收缩状态的容器-“前”和“后”,每个子视图都被约束到单元格主内容视图的顶部、底部、前缘和后缘。要使单元格展开或收缩,我只需在前视图和后视图的底部约束上切换isActive属性。这是可行的,但前提是我在点击单元格时重新加载单元格。如果我只是更改约束,然后尝试调用invalidateIntrinsicContentSize(),则什么也不会发生 overrid
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类早于此。它还通过自己的动画等批量更改。是否有关于使用自动布局调整单元格大小的过程的适当文档?我知道如何用自动布局制作细胞,并使其工作,但如果能理解其背后的机制,那就太好了。苹果的文档在某些方面有点蹩脚。据我所知不是这样。