UILabel 不会在 TableViewCell 中的初始加载时换行

Posted

技术标签:

【中文标题】UILabel 不会在 TableViewCell 中的初始加载时换行【英文标题】:UILabel does not wrap on initial load within TableViewCell 【发布时间】:2015-04-24 22:37:28 【问题描述】:

我正在创建一个基于聊天的应用程序,它使用UITableView 来保存对话中的所有消息。为了创建一个聊天气泡,我有一个包装视图 (wrapView),它被限制在 TableViewCell 的顶部、底部、右侧和左侧。作为一个子视图,我有一个UILabel,它包含已发送的消息。我将preferredMaxLayoutWidth 用于UILabel,以确保标签中的文本不会超出父视图。 UILabel 的行数也设置为 0。我在 cellForRowAtIndexPath 函数中设置了以下参数:

// Get the cell
let cell = tableView.dequeueReusableCellWithIdentifier("LeftBubbleText") as! LeftTextTableViewCell

// Set the message
cell.messageLabel.text = message

// Set the message label's max width
cell.messageLabel.preferredMaxLayoutWidth = cell.wrapView.frame.width - 16

首次加载对话时,UILabel 中的文本未正确换行。它在包装视图的末尾被截断。但是,当单元格从屏幕上滚出然后重新出现时,在重新使用单元格后,文本会被很好地换行。

如何确保 UILabel 中的文本在初始加载时正确包装,而不仅仅是在重复使用单元格时?

【问题讨论】:

【参考方案1】:

问题很可能是您使用的框架宽度错误。使用deqeueReusableCellWithIdentifier 创建的单元格没有与之关联的大小类,因为它们没有父视图。因此,如果您的单元格中有限制,尝试手动计算布局大小将无法正常工作。

您应该使用dequeueReusableCellWithIdentifier:forIndexPath 将您的单元格出列

【讨论】:

非常感谢您的帮助。我没有意识到使用deqeueReusableCellWithIdentifier 导致没有大小类与单元格相关联。我还在 dequeue 调用之后添加了cell.wrapView.frame = CGRect(x: cell.wrapView.frame.origin.x, y: cell.wrapView.frame.origin.y, width: enoteThreadTableView.frame.width - 96, height: 36) ,这解决了我最初的问题。由于包装视图被限制在单元格的左侧 (50) 和右侧 (46),因此在第一次加载时视图大小正确。

以上是关于UILabel 不会在 TableViewCell 中的初始加载时换行的主要内容,如果未能解决你的问题,请参考以下文章

自动布局:在 TableViewCell 中排列两个 UILabel

TableViewCell 中的 UILabel 在不应该扩展高度时

使用 tableViewCell 高度调整 UILabel 的高度

在自定义 TableViewCell 中动态更改 UILabel 框架

以编程方式将 UILabel 添加到自定义 tableViewCell

方向更改时的自定义 TableViewCell 自动布局问题