我有一个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次。 :)
答案 0 :(得分:0)
在iOS 11上,使用tableView.estimatedRowHeight = 0
禁用估计行高。
另外,覆盖layoutSubviews()
而不是layoutIfNeeded
。
override func layoutSubviews() {
super.layoutSubviews()
setupViews()
}
答案 1 :(得分:0)
检查您是否选择了"自定义"在tableViewCell的属性和"自动行高"和"自动行估计"在tableView的属性中。如果选择所有属性,则应该看到行的正确高度,而无需调用layoutIfNeeded
看图片:
答案 2 :(得分:0)
我意识到我的setupView中的print方法与layoutIfNeeded中的方法相同。结果,我看到2个print语句,我认为layoutIfNeeded中的代码被调用了两次。解决!