如何使用 UILabel 的高度正确增加 UITableViewCell

Posted

技术标签:

【中文标题】如何使用 UILabel 的高度正确增加 UITableViewCell【英文标题】:How to CORRECTLY increase UITableViewCell using UILabel's height 【发布时间】:2017-10-16 22:21:05 【问题描述】:

关于堆栈溢出的这个问题有很多答案,请知道我已经看过但所有解决方案都不适用于我。我在单元格中有两个 UILabel,一个有确定的宽度和高度,另一个是动态的,我将宽度设置为 =50。我还为内容视图设置了所有四个边距,然后我尝试了以下这两种方法来获取字符串的高度:

var context: NSStringDrawingContext = NSStringDrawingContext()
        context.minimumScaleFactor = 0.8
        cell?.body.text = msg.body
        var width: CGFloat = (cell?.body.frame.size.width)!
        width = ((UIScreen.main.bounds.width)/320)*width
        let size: CGSize = (cell?.body.text!.boundingRect(with: CGSize(width: width, height: 2000), options:NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName: cell?.body.font], context: context).size)!
        print("size.height is \(size.height)")
        return size.height

还有这个方法:

var optimalHeight : CGFloat

    get
    
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: self.frame.width, height: CGFloat.greatestFiniteMagnitude))
        //let label = UILabel(frame: CGRectMake(0, 0, self.frame.width, CGFloat.greatestFiniteMagnitude))
        label.numberOfLines = 0
        label.lineBreakMode = self.lineBreakMode
        label.font = self.font
        label.text = self.text

        label.sizeToFit()

        return label.frame.height
    

对于这两个,所附图像显示为 UILabel,正如任何人都可以看到的那样。

我也尝试在estimatedHeightForRowAt 和heightForRowAt 方法中实现UITableViewAutomaticDimension,但这不起作用,两行之后,它不会进一步扩展。 我尝试在 viewDidLoad() 方法中调用 estimatedRowHeight 和 rowHeight,如下所示:

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 300 //even went as far as using 800

同样的事情,在 2 行后停止扩展。 我还看到了一些关于实现这些方法的内容:

tableView.setNeedsLayout()
tableView.layoutIfNeeded()

但什么也没有!我已经浏览了 raywenderlich 教程等等。我不知道我做错了什么。这可能是一个重复的问题,但我向您保证,我已经尝试了所有解决方案,但对我没有任何作用。请有人看看这个,看看我做错了什么?

这些是两个标签的约束截图

【问题讨论】:

你为什么不使用自动布局?那就是您要省略的“正确”部分,就在那里。此功能(单元格自动调整其内容的大小)全部与自动布局有关 @matt 你是什么意思?我最近开始学习 swift 所以请您进一步解释一下吗?这篇 [文章] (appcoda.com/auto-layout-guide) 只是将自动布局解释为具有约束,而我已经有了这些约束?还是还有更多? 要使自动行高起作用,必须有一条通过视图和约束从单元格顶部到底部的路径。标签是单元格中唯一的东西吗?是否同时限制在顶部和底部? @Connor 单元格中有两个标签,一个具有固定的宽度和高度,并且具有低于相关标签的约束。所以有问题的标签是顶部的约束,尾随并通向内容视图,但它下面的标签被约束到内容视图的底部。你能解释一下或指出我正确的方向吗?我真的卡住了 顶部标签需要对顶部的约束和对下方标签的约束。底部标签需要对上方标签的约束和对底部的约束。听起来你两者都有,但你能确认一下吗? 【参考方案1】:

所以我在后台线程的 cellForRowAt 中包装了我的出队,这阻止了我的单元格是动态的。在我把那句话拿出来后,它工作得很好!如此浪费代码时间来修复从未损坏的东西

【讨论】:

以上是关于如何使用 UILabel 的高度正确增加 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

自动布局:UILabel 无法正确调整长文本的大小

UILabel改变高度,动画从中心展开

如何在 iOS Swift4 中滚动时增加/减少 UILabel 字体大小以及宽度和高度

如何使用 AutoLayout 使我的 UIImage 的高度与我的 UILabel 的固有高度相同?

UILabel 中 sizeToFit 的高度不正确

根据 UILabel 文本的数量增加 tableview 单元格的高度