gpt4 book ai didi

ios - sizeToFit() 返回错误的高度 - 需要在 heightForRow 中找到单元格宽度

转载 作者:可可西里 更新时间:2023-11-01 02:18:07 25 4
gpt4 key购买 nike

我正在尝试根据内容制作具有动态单元格高度的 UITableView。我的应用程序是一个文章查看器。我尝试使用这些函数计算单元格的高度。

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
label.numberOfLines = 0
label.lineBreakMode = .ByTruncatingTail
label.font = font
label.text = text

label.sizeToFit()
return label.frame.height
}

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
let post = FeedController.sharedController.allPosts[indexPath.row]
var height = 16.0
if post.hasImage {
height += Double(self.view.frame.width) / (4/3)
}

let titleH = heightForView(post.title!, font: UIFont(name: "LiberationSerif-Bold", size: 20.0)!, width: self.tableView.bounds.width)
let descH = heightForView(post.desc!, font: UIFont(name: "LiberationSerif", size: 17.0)!, width: self.tableView.bounds.width)

let totalHeight = CGFloat(height+Double(titleH)+Double(descH))

print("imageH: \(height), titleH: \(titleH) detailH: \(descH) totalH:\(totalHeight)")
return totalHeight
}

当我运行它时,它看起来像这样,如您所见,底部标签被切掉了。

enter image description here

我通过接口(interface)断点运行它,你可以在其中看到错误的原因:

enter image description here

呈现的尺寸比 sizeToFit() 的估计尺寸大一个尺寸,正如您从我的日志语句中看到的那样:

imageH: 297.25, titleH: 44.5 detailH: 56.5 totalH:398.25

我怀疑这个计算错误的原因是我为 heightForView 函数提供了错误的宽度参数。我尝试过使用 tableView.contentSize 和许多其他东西。 lineBreakMode 在我的 Storyboard和我的代码中是相同的。

我想我需要的是一种更好的方法来找到单元格的预期宽度,或者任何其他可以给我正确预期高度的解决方案。


编辑:约束: enter image description here

最佳答案

自动维度

使用更少的代码 (*),您可以完全放弃 heightForRowAtIndexPath,并为所有内容使用 autolayout

  1. 不要覆盖 heightForRowAtIndexPath(所有代码都会消失)
  2. 告诉 TableView 做艰苦的工作(例如在 viewDidLoad 中):
    self.tableView.estimatedRowHeight = 88
self.tableView.rowHeight = UITableViewAutomaticDimension

(*) 2 行 代码,准确地说。通过比较说服自己 2 lines solution反对multiple methods override solution .


边距说明

  • XIB & storyboard:您有能力控制约束及其与边距的关系。
    请注意,当使用Relative to margin 时,项目顺序很重要,因为边距通常是插入的。参见 https://stackoverflow.com/a/25420909/218152了解一些细节。

  • storyboard:您可以从 IB 访问额外的 topLayoutGuidebottomLayoutGuide 属性,这可能对您的 View Controller 有值(value),但对您的 UITableViewCell 来说是题外话。

关于ios - sizeToFit() 返回错误的高度 - 需要在 heightForRow 中找到单元格宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34731721/

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