UITableViewCell`sizeToFit`中的UILabel在AutoLayout的单元格内不起作用

Posted

技术标签:

【中文标题】UITableViewCell`sizeToFit`中的UILabel在AutoLayout的单元格内不起作用【英文标题】:UILabel inside UITableViewCell `sizeToFit` not working inside cell with AutoLayout 【发布时间】:2017-12-21 07:29:57 【问题描述】:

我已经尝试解决这个问题将近一天了。所以点应该与它旁边的 UILabel 对齐。问题是,当填充正确的内容时,第二个标签有时会变成 2 行。点必须与 UILabel 的第一行对齐,无论它有 1 行还是 2 行。

当单元格更新时,我尝试在运行时调用sizeToFit()。好像没什么效果。我读了Vertically align text to top within a UILabel 线程。

我模拟如果sizeToFit()(Editor -> Size to fit content)调用成功,行高不会缩小。

每一行由 UIView 组成,在这个视图里面有点和 UILabel。点也是 UIView。单行 UILabel 的行的高度常数为 20。可能有 2 行 UILabel 的行我设置为

点必须与 UILabel 的第一行对齐,无论它有 1 行还是 2 行。这在较小的屏幕上效果很好。

有人可以帮忙吗?

【问题讨论】:

您是否将 UILabel 的 noOfLines 设置为 0 ? @Seto Elkahfi 是的。我在 IB 上设置。 @dahiya_boy 它必须与 UILabel 的第一行对齐,无论是 1 行还是 2 行 @SetoElkahfi 我知道解决方案,给我 10 分钟 将点视图的顶部约束设置为上方的 UILable 【参考方案1】:

1. UIViewController 层次结构

2。约束

    View Main Content BG

    top、bottom、leading、trailing = 0 wrt superview。

    lbl1

    top = 10 , trailing = 10 wrt superview

    dot1

    leading = 10 top = lbl1.top ,水平空间 wrt 到 lbl1 = 10,height = 10 width = 10

    lbl2

    垂直间距 wrt lbl1 = 10 ,leading & trailling = lbl1.leading & lbl1.leading

    dot2

    领先 = dot1.leading ,顶部 = lbl2.top ,高度 = 10 宽度 = 10

    lbl3

    垂直空间 wrt lbl2 = 10 ,前导和尾随 = lbl2.leading & lbl2.leading 和底部 = 10 wrt superview

    dot1

    领先 = dot2.leading ,顶部 = lbl3.top ,高度 = 10 宽度 = 10

不要忘记每个标签的行数 = 0。并绑定 tableview 委托和数据源 wrt VC。

3.现在您的故事板设计如下所示

4.现在在 VC 中

虚拟数组

var arrList : [[String : String]] = [["lbl1": "Do any additional setup after loading the view, typically from a nib.",
                                          "lbl2": "Do any additional.",
                                          "lbl3": "that can be recreated"],
                                         ["lbl1": "Do any additional .",
                                          "lbl2": "Do any additional setup after loading the view, typically from a nib.",
                                          "lbl3": "that can be recreated"],
                                         ["lbl1": "Do any additional . Do any additional setup after loading the view, typically from a nib.",
                                          "lbl2": "Do any additional setup after loading the view, typically from a nib.",
                                          "lbl3": "that can be recreated Do any additional setup after loading the view, typically from a nib. Do any additional setup after loading the view, typically from a nib."]]

TableView 委托和数据源

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat 
    return 110


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    return UITableViewAutomaticDimension


public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    return arrList.count



public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    let cell = tableView.dequeueReusableCell(withIdentifier: "TblCell") as! TblCell

    let dict = arrList[indexPath.row]

    cell.lbl1.text = dict["lbl1"]
    cell.lbl2.text = dict["lbl2"]
    cell.lbl3.text = dict["lbl3"]

    return cell

5.最终输出

编辑

如果你用他们的 respec 标签设置了 constant = 5 wr 的点顶部,那么输出如下。

【讨论】:

我试试看。 我接受你的回答。我太专注于当前的视图组件并且害怕重构。自己注意。谢谢。 +1 实现估计的高度为我修复了它【参考方案2】:

    将行数 0 设置为 UILable 并移除其高度约束。所以它会相应地增长它的内容。

    为 UILable 提供适当的前导、顶部、尾随、底部约束。将 UITableViewRow 高度属性设置为 UITableViewAutomaticDimesion tableview.rowHeight = UITableViewAutomaticDimesion tableView.estimatedRowHeight = 44

    将恒定的宽度和高度约束设置为点视图,并将其前导约束设置为单元格视图,将水平间距设置为标签。并将其与 UILabel 的顶部对齐。

使用上述方式,无需设置 sizeToFit 等属性。 它会解决你的问题。

您在将高度约束设置为 UILable 时遇到了问题。如果您从当前代码中删除它,它将解决您的问题。

【讨论】:

我没有为 UILabel 设置高度约束。这是它的父视图。【参考方案3】:

目前,如果您没有找到任何解决方案,您可以尝试复制该字符 ■ 并将其粘贴到标签字符串的开头。该临时解决方案适用于您。

您可以使用属性选项更改颜色和喜好。

【讨论】:

它会起作用,但如果 UILabel 之一有两行,点将不在同一列中。谢谢。 你可以使用 NSMutableAttributedString 来改变第一个字符的颜色和字体大小。

以上是关于UITableViewCell`sizeToFit`中的UILabel在AutoLayout的单元格内不起作用的主要内容,如果未能解决你的问题,请参考以下文章

UITextView,sizeToFit 行为怪异

uilabel sizetofit 不起作用

sizeToFit()使用心得

SizeToFit() 不能与 \n 一起正常工作?

为啥此代码中需要“sizeToFit”调用?

IOS UILlabel sizeToFit