layoutIfNeeded中的代码被调用两次

时间:2018-01-15 13:21:11

标签: ios swift uitableview

我有一个tableview,我使用这个方法计算单元格高度

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次。 :)

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

检查您是否选择了"自定义"在tableViewCell的属性和"自动行高"和"自动行估计"在tableView的属性中。如果选择所有属性,则应该看到行的正确高度,而无需调用layoutIfNeeded

看图片:

enter image description here

enter image description here

答案 2 :(得分:0)

我意识到我的setupView中的print方法与layoutIfNeeded中的方法相同。结果,我看到2个print语句,我认为layoutIfNeeded中的代码被调用了两次。解决!