如何更新自行调整tableview的高度?

时间:2015-09-26 16:49:16

标签: ios uitableview swift2

如果我在单元格中放置自定义视图,如果我的自定义视图的高度发生了变化,如何通知tableview更新单元格的高度?我尝试了invalidateIntrinsicContentSize,但这不起作用。 ReloadData有效,但我怀疑是否使用

self.superview?.superview?.superview as! UITableView).reloadData()

是一个很好的实现。 我见过类似的问题here,但这都是关于标准库的观点。 thisthis没有答案。

1 个答案:

答案 0 :(得分:1)

你正在思考正确的方向。但是,您的方法存在两个问题:

  1. reloadData重新加载整个表格视图,但不会对更改进行动画处理。
  2. 当Apple更改UITableView视图层次结构时,向上移动超级视图链必然会中断。他们之前已经这样做了,所以他们可能会再做一次。
  3. 要修复第一个问题,您应该致电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?()
    }