gpt4 book ai didi

swift - TableView 计算错误的 estimatedHeightForRowAt

转载 作者:IT王子 更新时间:2023-10-29 05:48:30 24 4
gpt4 key购买 nike

我正在制作一个类似聊天的应用程序,其中 tableView 显示动态高度单元格。


单元格以正确的方式限制了它们的 View 和 subview

So that the AutoLayout can predict the height of the cells

(Top, Bottom, Leading, Trailing)


但仍然- 正如您在视频中看到的那样- 滚动指示条显示计算的高度有误:

它会在新行出现时重新计算高度。

视频: https://youtu.be/5ydA5yV2O-Q

(第二次尝试向下滚动一切正常)


代码:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}

这是一个简单的问题。有人可以帮帮我吗?

更新 1.0

添加了github:

https://github.com/krptia/Test

最佳答案

But still - as you can see in the video - the scroll indicator bar shows that wrong heights were calculated:

所以你想要的是精确的内容高度。

为此,您不能使用静态 estimatedRowHeight。您应该像下面这样实现更正确的估计。

    ...

var sampleCell: WorldMessageCell?

override func viewDidLoad() {
super.viewDidLoad()

tableView.register(UINib(nibName: "WorldMessageCell", bundle: nil), forCellReuseIdentifier: "WorldMessageCell")

sampleCell = UINib(nibName: "WorldMessageCell", bundle: nil).instantiate(withOwner: WorldMessageCell.self, options: nil)[0] as? WorldMessageCell
}

...

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
if let cell = sampleCell {
let text = self.textForRowAt(indexPath)
// note: this is because of "constrain to margins", which value is actually set after estimation. Do not use them to remove below
let margin = UIEdgeInsets(top: 8, left: 20, bottom: 8, right: 20)
// without "constrain to margins"
// let margin = cell.contentView.layoutMargins
let maxSize = CGSize(width: tableView.frame.size.width - margin.left - margin.right,
height: CGFloat.greatestFiniteMagnitude)
let attributes: [NSAttributedString.Key: Any]? = [NSAttributedString.Key.font: cell.messageLabel.font]
let size: CGRect = (text as NSString).boundingRect(with: maxSize,
options: [.usesLineFragmentOrigin], attributes: attributes, context: nil)
return size.height + margin.top + margin.bottom
}
return 100
}

这太精确了(实际上是实际的行高)并且可能很慢,但是您可以进行更近似的估计以进行优化。

关于swift - TableView 计算错误的 estimatedHeightForRowAt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54245511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com