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

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

【问题讨论】:

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

标签: ios uitableview autolayout uilabel ios-autolayout


【解决方案1】:

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

【讨论】:

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

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

【讨论】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 2021-01-14
    • 2017-01-01
    • 2018-06-05
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多