Ios 在Swift 3中动态调整UITableViewCell的高度失败

Ios 在Swift 3中动态调整UITableViewCell的高度失败,ios,swift,uitableview,uitableviewautomaticdimension,Ios,Swift,Uitableview,Uitableviewautomaticdimension,我有一个自定义的UITableViewCell,我希望它根据我的标签文本内容更新高度 但我尝试在我的ViewController ViewDidLoad中使用以下代码: tableView.register(ChatRightTextTableViewCell.self, forCellReuseIdentifier: ChatRightTextTableViewCell.identifier) tableView.estimatedRowHeight = 100.0 tableVi

我有一个自定义的UITableViewCell,我希望它根据我的标签文本内容更新高度
但我尝试在我的ViewController ViewDidLoad中使用以下代码:

  tableView.register(ChatRightTextTableViewCell.self, forCellReuseIdentifier: ChatRightTextTableViewCell.identifier)
  tableView.estimatedRowHeight = 100.0
  tableView.rowHeight = UITableViewAutomaticDimension

它似乎不会更新高度。
我的手机限制有什么问题吗?
谢谢

明白了

如果您使用了xib,您会注意到警告,因为您已经对其进行了编码并贴上了标签—很难猜出问题:)

您使用的是两个标签,它们基本上根据显示的内容决定单元格的高度。但由于两者在垂直轴上具有相同的内容优先权,仅为这些标签提供顶部和底部约束是不够的

您必须将其中一个标签(您认为其内容明显较小)的垂直轴上的内容优先权设置为更高的值,以提供足够的数据来计算单元格的动态高度

总结:

简单设置

labelDatetime.setContentHuggingPriority(252, for: .vertical)


在使用xib的情况下,Autolayout通常会提供警告。这是您的问题:内容优先权和内容压缩阻力

内容包含优先级是一个值,该值指示视图的内容是否应具有优先权,以便在超级视图自身的约束上拉伸其超级视图。在这种情况下,标签没有优先于单元格内容视图来拉伸它,因此它会被压扁

类似地,内容压缩阻力是一个值,该值指示视图的内容是否具有基于自身的限制其superview帧的优先级。例如,如果您的单元格想要达到高度1,但您的标签具有更高的内容压缩阻力,并且高度为,比方说2,则单元格将被迫将自身限制为2

对此提供了很好的解释

那么让我们来解决你的问题。

指定更大的内容覆盖优先级或内容压缩阻力。在您的情况下,标签似乎没有拉伸单元格的优先级,因此设置拥抱优先级:

labelDatetime.setContentHuggingPriority(500,用于:。垂直)

或者,尝试内容压缩,让单元格优先于控制其自身高度,同时尊重标签的边界

按照以下步骤,根据内容将
UITableCell
高度设置为动态。这是实现所有步骤的非常简单的方法

  • UITableViewCell
    中删除所有约束
  • 删除所有编程约束
  • 现在从图中给出的
    UITableViewCell
    中设置所有约束
  • 表示给出所有约束
    顶部
    底部
  • 如果您想要标签的背景,请使用xCode右侧的
    属性检查器
  • 如果您想使用收音机,请使用
    标识检查器
    选项卡并添加
    用户定义的运行时属性
    关键路径->
    图层。cornerRadius
    ,键入->
    编号
    和值->5/或您想要给出的内容
  • 如果要指定要标记的行数,请从
    属性检查器
    中选择作为
    多行
    对齐
  • 如果不需要,请给出第0行的编号,并选择“作为多行对齐”,然后选中“自动调整字体”
现在让我们来看看编程的限制

删除功能,如果你有使用


看到这个答案很抱歉,我检查了链接,但我的自定义单元格没有使用xib。这不起作用。动态高度必须使用自动布局,因此在设计中避免使用固定高度。看起来您的约束设置错误。对于
UITableViewAutomaticDimension
您需要在每个方向上设置约束。@tolerate_Me_Thx:在应用约束后尝试调用LayoutIfNeed()。我知道您在布局子视图中调用它,从技术上讲,不需要调用它,但有时我看到当你不调用layoutIfNeeded时,自动布局的行为会很奇怪,尤其是当涉及到一个具有内在大小的标签时。很抱歉,我刷了值:)让我更新我的答案:它与我的答案有什么不同?我在写我的答案时,没有看到你的答案,因为你可以看到时间戳非常接近。
labelDatetime.setContentHuggingPriority(252, for: .vertical)
var labelDatetime:UILabel = { ()->UILabel in
let ui = GeneratorLabel()
ui.font = defaultMessageTimeFont
ui.textColor = defaultChatTimeColor
ui.numberOfLines = 0
ui..setContentHuggingPriority(252, for: .vertical)
return ui
}()
//Set Both line in view did upload function with same format 
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 100.0
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
}