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

UILabel does not wrap on initial load within TableViewCell

我正在创建一个基于聊天的应用程序,它使用 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 中的文本在初始加载时正确包装,而不仅仅是在重复使用单元格时?

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

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