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

Posted

技术标签:

【中文标题】UITableView 单元格不使用标签文本自动调整大小【英文标题】:UITableView Cells not Autoresizing With Label Text 【发布时间】:2018-03-06 03:11:54 【问题描述】:

编辑编辑:我在一个新项目中从头开始。每个故事板出口都是相同的,VC 代码也是如此。有趣的是,它有效。

编辑:大家好,我放弃了。每个答案都开始成为主题的变体,而该主题并不能解决此问题。不过感谢您的尝试。

ViewDidLoad 中,我设置了: tableView.estimatedRowHeight = 85.0, tableView.rowHeight = UITableViewAutomaticDimension

我还在情节提要中设置:内容视图的自动调整大小约束。

要换行的标签,以及到 0 的标签行

然而,标签文本仍在其单元格中溢出。 完整的字符串是:“HELLO?如果我写一个长句子会发生什么?”

有什么建议吗?

这是整个视图控制器: 这是选择标签的情节提要:

推荐功能之后: enter image description here 结果: enter image description here

【问题讨论】:

您是否也为内容视图中的标签提供了顶部、左侧、右侧和底部约束?还有行到 0 和换行到自动换行?? 是的。如果您查看第一张图片,您将在内容视图中看到标签的约束。在此之下,我相信我还声明了标签换行,并且行设置为 0。 在你的 calss 中添加这个委托 --> func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat return UITableViewAutomaticDimension 让我知道它是否适合您,否则会建议一些其他解决方案 @blue_shoes 你想做什么?您要将所有文本修复为单元格还是将单元格自动调整大小为内容? 【参考方案1】:

您没有设置 heightForRowAt indexPath.. 为此,您应该首先获取文本的大小 在我的情况下,我通过

func rectForText(text: String, font: UIFont, maxSize: CGSize) -> CGSize

    let attrString = NSAttributedString.init(string: text, attributes: [NSAttributedStringKey.font:font])
    let rect = attrString.boundingRect(with: maxSize, options: NSStringDrawingOptions.usesLineFragmentOrigin, context: nil)
    let size = CGSize(width: rect.size.width, height: rect.size.height)//(, )
    return size

并根据您的文本设置单元格的高度,在 我的情况

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

    var totalHeight : CGFloat = 0
    let str = yourString
    let size : CGSize = rectForText(text: str, font:UIFont.boldSystemFont(ofSize: 15.0) , maxSize : CGSize(width: 200 * (SCREEN_WIDTH / 320), height: 20000) )
    totalHeight = size.height
    return CGFloat(totalHeight)

可能对你有用

【讨论】:

【参考方案2】:

尝试向内容视图中的标签添加约束。

例如: 左 - 8 分 最高 - 8 分 正确 - 8 分 垫底 - 8 分

现在它应该留在单元格内。

【讨论】:

不幸的是,问题是多个单词 - 会跨越到额外的行 - 被切断。我已经编辑了我的帖子以包含原始字符串。【参考方案3】:

您需要添加heightForRowAtIndexPath 以根据其内容自动调整单元格高度。

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

【讨论】:

嗨,Sid,Ishika 在上面推荐了这个,但是当我在类中添加这个函数旁边的其他委托函数时,它仍然不起作用。【参考方案4】:

看看我的输出截图。对于标签,您应该给出所有四个约束(顶部:5,底部:5,左侧:5,右侧:5)并且您必须将标签的优先级的高度更改为 750 并将拥抱和阻力优先级设置为 1000 . 然后你必须将storyboard中的行数改为0

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

        return UITableViewAutomaticDimension
    

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

        return 250

    

【讨论】:

您好,感谢您的周到回复 - 我已经实现了这一点,其他委托 tableView 功能旁边的功能 - 但没有任何改变。 你改变了优先级吗? 是的,我将拥抱和阻力优先级设为 1000,并为我设置为 750 的标签添加了 >=10 的高度约束。我保留了顶部/底部/尾随的其他 4 个约束/leading,全部 10,行数为 0。我很困惑。 我会再次发布它,添加的功能。 @blue_shoes:您好,我也遇到了同样的问题。请问您解决了吗?

以上是关于UITableView 单元格不使用标签文本自动调整大小的主要内容,如果未能解决你的问题,请参考以下文章

自动调整嵌入在 UITableView 中的 UICollectionView 单元格不起作用

ios第一个单元格不是从UITableView的顶部开始

延迟加载 - UITableview 可见单元格不显示图像

UITableView 自定义单元格不显示数据

iOS 8 UITableView,静态单元格不可见

从笔尖加载的 UITableView 单元格不显示背景颜色