如何阻止 UILabel 在 UITableCellView 中用“...”截断
Posted
技术标签:
【中文标题】如何阻止 UILabel 在 UITableCellView 中用“...”截断【英文标题】:How to stop UILabel from truncating with '...' in UITableCellView 【发布时间】:2015-03-30 19:48:27 【问题描述】:我在自定义表格单元格中有两个 UILabel
s,每个在 Interface Builder 中都将“Lines”设置为“0”。它们垂直堆叠,左右边缘对齐,在表格内,行高由自动布局确定。但其中一个人坚持要截断。为什么?它应该占用所需的行并推出表格单元格的高度。
【问题讨论】:
我可以建议您在问题中包含您正在使用的代码吗?如果不了解产生此结果的代码,就很难提供帮助。 是否曾经有过涵盖所有问题的公认答案? 【参考方案1】:您需要确保将preferredMaxLayoutWidth
设置为UILabel
。 ios8 应该为您执行此操作,但我也遇到了在自定义动态大小 UITableViewCell
s 时结尾被截断的问题。解决方法是将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 显示,直到您从调试视图层次结构继续