如何调整tableViewcell的大小后,如何获得正确的tableView高度

时间:2017-12-05 19:17:58

标签: ios swift uitableview autolayout layoutsubviews

TL;博士 如何在细胞膨胀导致细胞高度变化后更正我的tableView的高度 - 不使用延迟?

我的tableViewslls,展开和折叠。因此,我需要传递(使用委托方法)tableView的高度到它的superView。它的superview是一个collectionviewcell。

extension ArtistDetailViewController: UITableViewDelegate{

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        guard let cell = tableView.cellForRow(at: indexPath) as? WorkTableViewCell else {
            fatalError()
        }

        //1: create model
        var work = works[indexPath.row]

        //2: update the model
        work.isExpanded = !work.isExpanded

        //3: upadte dataSource
        works[indexPath.row] = work

        //4: update the text of textView
        cell.moreInfoTextView.text = work.isExpanded ? work.info : WorkTableViewCell.textViewText
        cell.moreInfoTextView.textAlignment = work.isExpanded ? .left : .center

        //5: update TableView
        tableView.beginUpdates()
        tableView.endUpdates()
        tableView.scrollToRow(at: indexPath, at: .top, animated: true)

        //6: slavishly update cell with everything you got!
        cell.setNeedsUpdateConstraints()
        cell.updateConstraintsIfNeeded()

        cell.contentView.setNeedsUpdateConstraints()
        cell.contentView.updateConstraintsIfNeeded()
        cell.contentView.setNeedsLayout()
        cell.contentView.layoutIfNeeded()

        print(tableView.contentSize.height) // prints 252
        //7: pass tableView height with delay
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.01, execute: {
            print(tableView.contentSize.height) // prints 341
            self.tableViewHeight = tableView.contentSize.height
            self.delegate?.didRender(with: self.tableViewHeight)
        })
    }
}

我的ArtistDetailViewController有一个tableView属性。

tableView属性subclassed from a tableView which has intrinsicSize

class AutomaticHeightTableView: UITableView {

  override var intrinsicContentSize: CGSize {
    return contentSize
  }

  override func reloadData() {
    super.reloadData()
    invalidateIntrinsicContentSize()
  }
}

我遇到的问题是,如果我使用任何延迟(步骤7):

  1. tableView的高度会被放大足够即它会放大,但只是放大不够。
  2. tableView以后不会崩溃。
  3. 即使我确实使用延迟 也不会崩溃/扩展\ o /
  4. 显然问题是这些更新是以异步方式完成的,而且计算的值太快了!至于证据:

    如果看到打印件,则延迟后tableView的高度从252变为341。

    在我的第6步中,我尝试添加各种更新,以便我可以避免添加延迟,但这不起作用。

    延迟的结果:

    enter image description here

    结果毫不拖延:

    enter image description here

0 个答案:

没有答案