如何使用 UILabel 的高度正确地增加 UITableViewCell
How to CORRECTLY increase UITableViewCell using UILabel's height
这个关于堆栈溢出的问题有很多答案,请知道我已经看过了,但所有的解决方案都不适合我。我在单元格中有两个 UILabel,一个具有确定的宽度和高度,另一个是动态的,我将宽度设置为 <= 250,高度 >=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 教程以及更多内容。我不知道我做错了什么。这可能是一个重复的问题,但我向您保证我已经尝试了所有解决方案,但对我来说没有任何效果。请有人看看这个,看看我做错了什么吗?
这些是两个标签约束的截图
所以我在后台线程的 cellForRowAt 中包装了我的出队,这阻止了我的单元格是动态的。在我把那个语句拿出来之后,它完美地工作了!修复从未损坏的东西真是浪费代码时间
这个关于堆栈溢出的问题有很多答案,请知道我已经看过了,但所有的解决方案都不适合我。我在单元格中有两个 UILabel,一个具有确定的宽度和高度,另一个是动态的,我将宽度设置为 <= 250,高度 >=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 教程以及更多内容。我不知道我做错了什么。这可能是一个重复的问题,但我向您保证我已经尝试了所有解决方案,但对我来说没有任何效果。请有人看看这个,看看我做错了什么吗?
这些是两个标签约束的截图
所以我在后台线程的 cellForRowAt 中包装了我的出队,这阻止了我的单元格是动态的。在我把那个语句拿出来之后,它完美地工作了!修复从未损坏的东西真是浪费代码时间