如何阻止 UILabel 在 UITableCellView 中用“...”截断

Posted

技术标签:

【中文标题】如何阻止 UILabel 在 UITableCellView 中用“...”截断【英文标题】:How to stop UILabel from truncating with '...' in UITableCellView 【发布时间】:2015-03-30 19:48:27 【问题描述】:

我在自定义表格单元格中有两个 UILabels,每个在 Interface Builder 中都将“Lines”设置为“0”。它们垂直堆叠,左右边缘对齐,在表格内,行高由自动布局确定。但其中一个人坚持要截断。为什么?它应该占用所需的行并推出表格单元格的高度。

【问题讨论】:

我可以建议您在问题中包含您正在使用的代码吗?如果不了解产生此结果的代码,就很难提供帮助。 是否曾经有过涵盖所有问题的公认答案? 【参考方案1】:

您需要确保将preferredMaxLayoutWidth 设置为UILabelios8 应该为您执行此操作,但我也遇到了在自定义动态大小 UITableViewCells 时结尾被截断的问题。解决方法是将layoutSubviews 中的preferredMaxLayoutWidth 设置为标签的宽度。

【讨论】:

好的,这很有效,但我使用了硬编码的 300 或单元格宽度。在更复杂的布局中......我是否坚持做自动布局应该做的计算,以计算 preferredMaxLayoutWidth 的这个值? 我看多了,你可以在 layoutSubviews 中设置 preferredMaxLayoutWidth。我会把它添加到我的答案中。 layoutSubviews 属于哪一类?我把它放在控制器的viewDidLayoutSubviews,但是标签的宽度在那里是错误的——它是574,但整个屏幕只有320。 试着把它放在你的 UITableViewCell 的子类中。 同样的问题。我收到了 Apple 的开发支持请求。如果他们有解决方案,我会回复。【参考方案2】:

尝试拨打[cell.textLabel sizeToFit] 它将根据其内容调整标签视图的大小。

【讨论】:

我把它放在几个地方,比如viewDidLayoutSubviews。我可以让它显示第二行,但单元格的高度没有按应有的增长。所以第二个标签的第二行与下一个单元格重叠。【参考方案3】:

要获得自动调整单元格大小,您需要确保具备以下条件(考虑到您使用的是自动布局)

    确保您的视图具有最终触及单元格边缘的约束,在您的情况下,由于您只有一个标签,您可以将顶部、左侧、右侧和底部间距设置为 0 到所有边缘。 确保将tableView 的estimatedRowHeight 属性设置为一个值,例如tableView.estimatedRowHeight = 44 确保在 viewDidLoad 上将 tableView 的 rowHeight 属性设置为 UITableViewAutomaticDimension 确保标签的行数为 0

这样,您的细胞将根据需要生长,您应该能够正确地看到您的标签。

谢谢

【讨论】:

是的,我做了所有这些事情。 在 tableview 数据源中的 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 方法的实现中返回单元格之前尝试调用 cell.layoutIfNeeded()【参考方案4】:

单元格和 viewDidLayoutSubviews 的 layoutSubviews 不起作用。您需要为单元格使用自定义容器视图并在容器 layoutSubviews 中设置 PreferredMaxLayoutWidth。我有 UIView 的特殊子类

类 ExtendedView:UIView

var didLayoutSubviews:(()->Void)!;

override func layoutSubviews() 
    super.layoutSubviews();
    if let completion = didLayoutSubviews 
        completion();
        layoutIfNeeded();
    

使用示例

container.didLayoutSubviews = [unowned self] in
    let left =  self.statusLabel.frame.minX - 4;
    width = left - self.title.frame.minX;
    self.title.preferredMaxLayoutWidth = round(width)
    container.layoutIfNeeded()

【讨论】:

以上是关于如何阻止 UILabel 在 UITableCellView 中用“...”截断的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIPanGestureRecognizer 垂直移动 UILabel 时,如何阻止它们在任一方向上走得太远?

为啥在 Interface Builder 中更改字体大小会阻止 UILabel 调整大小以适应内容?

CollectionViewCell 中的 UILabel 不阻止触摸事件

UILabel 阻止 UIButton 显示,直到您从调试视图层次结构继续

如何通过 UIButtons 读取 UILabel(没有文本)

NGUI如何让uilabel框大小随文字增加而变化