具有三个 UILabel 的自我调整大小的单元格不起作用

Posted

技术标签:

【中文标题】具有三个 UILabel 的自我调整大小的单元格不起作用【英文标题】:Self sizing cells with three UILabels not working 【发布时间】:2016-09-08 03:22:42 【问题描述】:

这是我的UITableViewCell

三个UILabels 具有trailingtopbottomleading 约束。

这是UILabel 名称的拥抱优先级和抗压优先级:

这是UILabel 位置的拥抱优先级和抗压优先级:

这是UILabel 类型的拥抱优先级和抗压优先级:

在我的UITableViewControllerviewDidLoad 上,我正在做这样的事情:

 self.tableView.estimatedRowHeight = 80
 self.tableView.rowHeight = UITableViewAutomaticDimension
 self.tableView.reloadData()

但是当我运行应用程序时,UITableViewCells 不会自行调整大小:

我做错了什么或者我需要做什么才能让UITableViewCells 让它们自行调整大小?

编辑

我将每个UILabelnumberOfLines 设置为0,现在UILabel 的位置不会出现

【问题讨论】:

Location UILabel 的垂直拥抱优先级比其他的低 1,介意解释一下为什么这样做吗? @Z.Hung 它在另一个项目中对我有用,但我不知道如何让它在新项目中工作 您是否尝试过更改拥抱优先级以使它们都相同? @Z.Hung 是的,我收到有关优先级的 xcode 错误 你应该把Content hugging priority vertical增加到751,而不是阻力 【参考方案1】:

很有可能您的 Text 在运行时变大,导致单元格视图中的总高度大于行高本身。

首先将所有拥抱优先级相等,然后尝试更改具有“大于或等于”关系的标签之间的间距,然后将常数设置为较小的值,例如零。如果您仍然遇到约束错误,请增加您的 tableView 行高。

替代方法: 将所有 3 个 UILabel 添加到另一个 UIView 中,它们之间的间距为零,不要为此 UIView 设置高度约束,只需将其设置在 cellView 的 centerY 并与 ImageView 隔开

提示:即使在约束被破坏后,如果您的 UI 是您想要的,只有更改约束优先级,除非您当然知道自己在做什么

【讨论】:

【参考方案2】:

你的情况不需要垂直拥抱优先,只要给

label.numberOfLines = 0

效果很好。

【讨论】:

我将所有UILabels 中的numberOfLines 设置为0,现在位置UILabel 没有出现【参考方案3】:

问题说您想调整标签的大小,但根据您的代码,您似乎想通过调整 tableview 行的大小来做到这一点。如果是这种情况,在 tableView 中设置行高的正确位置是:

  override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 

    return 80


“return 80”表示您希望表格行的高度为 80。如果我没有正确理解您的问题,请告诉我。

【讨论】:

这对我不起作用,因为我希望 UITableViewCell 能够自行调整大小【参考方案4】:

标签不起作用,因为情节提要不是很有用。

设置var:

var imageView: UIImageView =
let image = UIImageView()
image.translatesAutoresizingMaskIntoConstraints = false
return image
()

var textView: UITextView =
let text = UITextView()
text.translatesAutoresizingMaskIntoConstraints = false
return text
()

然后你继续使用其他标签。

你必须像这个例子一样设置约束:

self.addSubview(imageView)
self.addSubview(textView)

imageView.bottomAnchor.constraintEqualToAnchor(self.bottomAnchor, constant: -10).active=true
imageView.leftAnchor.constraintEqualToAnchor(self.leftAnchor, constant:-10).active=true
imageView.widthAnchor.constraintEqualToConstant(70).active=true
imageView.heightAnchor.constraintEqualToConstant(70).active=true

label.topAnchor.constraintEqualToAnchor(self.topAnchor, constant: -5).active=true
label.leftAnchor.constraintEqualToAnchor(imageView.rightAnchor, constant: 3).active=true
label.widthAnchor.constraintEqualToAnchor(self.widthAnchor, constant -70).active=true
label.heightAnchor.constraintEqualToConstant(30).active=true

label2.topAnchor.constraintEqualToAnchor(label.bottomAnchor, constant: 5).active=true
label2.leftAnchor.constraintEqualToAnchor(imageView.rightAnchor, constant: 3).active=true
label2.widthAnchor.constraintEqualToAnchor(self.widthAnchor, constant -70).active=true
label2.heightAnchor.constraintEqualToConstant(30).active=true

并且通过这种方式也可以用于第三个标签。

【讨论】:

但我没有使用任何UITextView @pableiros 我已经更新了答案,标签是一样的。

以上是关于具有三个 UILabel 的自我调整大小的单元格不起作用的主要内容,如果未能解决你的问题,请参考以下文章

自我调整大小的表格视图单元格不起作用

UILabel preferredMaxLayout 打破了自我调整大小的单元格

使用 swift 自动调整大小的集合视图单元格不起作用

具有自我调整大小的单元格的集合视图不再可水平滚动

UITableView 单元格不使用标签文本自动调整大小

具有自我调整大小的单元格的 UICollectionViewFlowLayout 在 reloadData 后崩溃