我有一个表格视图,并使用此方法计算像元高度

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    guard let audioTitle = audioData[indexPath.row].audioTitle else {return 50}
    return estimatedHeightOfLabel(text: audioTitle, fontSize: 20, fontName: "AvenirNext-Medium", screenWidth: view.frame.width) + 16
}


但是,在我的自定义tableView单元格类中,框架高度在init内仍为44。

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    selectionStyle = .gray
    backgroundColor = .clear
    print(frame.height) //value is 44
}


因此,我必须使用layoutIfneeded更新我的框架高度,以便可以将其用作标签高度锚点。

override func layoutIfNeeded() {
    print(frame.height) // 56, 70, etc.
    setupViews()
}


但是我里面的代码被两次调用过,如56,56,70,70等。有什么想法,有办法避免吗?我也尝试过layoutSubviews,但是里面的代码被调用了4次。 :)

最佳答案

在iOS 11上,使用tableView.estimatedRowHeight = 0禁用估计的行高。

另外,请覆盖layoutSubviews()而不是layoutIfNeeded

override func layoutSubviews() {
    super.layoutSubviews()
    setupViews()
}

关于ios - layoutIfNeeded内部的代码被调用两次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48263855/

10-08 20:59