如果我在单元格中放置自定义视图,如果我的自定义视图的高度发生了变化,如何通知tableview更新单元格的高度?我尝试了invalidateIntrinsicContentSize,但这不起作用。 ReloadData有效,但我怀疑是否使用
self.superview?.superview?.superview as! UITableView).reloadData()
答案 0 :(得分:1)
你正在思考正确的方向。但是,您的方法存在两个问题:
reloadData
重新加载整个表格视图,但不会对更改进行动画处理。 UITableView
视图层次结构时,向上移动超级视图链必然会中断。他们之前已经这样做了,所以他们可能会再做一次。要修复第一个问题,您应该致电reloadRowsAtIndexPaths:withRowAnimation:
。这只会重新加载您在indexPath数组中指定的单元格。所以你传递一个只包含你单元格的indexPath的数组。
第二个问题有点棘手,因为UITableViewCell
没有引用它的UITableView
(它不应该)。因此它无法直接告诉UITableView
重新加载单元格。
你可以给每个单元格一个闭包,它应该在它的高度发生变化时执行。所以你只需在自定义单元格中添加一个闭包属性:
class YourCustomTableViewCell: UITableViewCell {
var resizeClosure: (() -> Void)?
...
当你将单元格出列时,你在UITableViewControllerDataSource
中设置了这个闭包:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier("YourCustomCellIdentifier", forIndexPath: indexPath)
if let customCell = cell as? YourCustomTableViewCell {
customCell.resizeClosure = { [weak cell, weak tableView] in
if let currentIndexPath = tableView?.indexPathForCell(cell!) {
tableView?.reloadRowsAtIndexPaths([currentIndexPath], withRowAnimation: .Automatic)
}
}
}
return cell
}
只需确保将tableView
添加到闭包的捕获列表中,以避免强引用周期。这是通过将[weak tableView]
添加到闭包来完成的。
然后当单元格改变其高度时,您只需执行闭包,然后重新加载单元格:
func someFunctionThatChangesTheHeight() {
// change the height
resizeClosure?()
}