我有一个表格视图,并使用此方法计算像元高度
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/