繁体   English   中英

如何更新自调整表格视图的高度?

[英]How to update self-sizing tableview's height?

如果将自定义视图放在单元格中,如果自定义视图的高度已更改,如何通知tableview更新单元格的高度? 我试过invalidateIntrinsicContentSize,但是不起作用。 ReloadData有效,但我怀疑是否使用

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

是一个很好的实现。 我在这里看到了类似的问题但这全都是关于标准库的视图。 这个这个没有答案。

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

  1. reloadData重新加载整个表视图,并且不对更改进行动画处理。
  2. 当Apple更改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?()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM