使用 AutoLayout 将 UIView 隐藏在单元格内时,不适合 UITableViewCell 高度

Posted

技术标签:

【中文标题】使用 AutoLayout 将 UIView 隐藏在单元格内时,不适合 UITableViewCell 高度【英文标题】:UITableViewCell height is not fitted when hiding UIView inside the cell using AutoLayout 【发布时间】:2015-11-26 03:33:16 【问题描述】:

我已经为这个问题苦苦挣扎了 3 天,但仍然无法弄清楚。我希望这里的任何人都可以帮助我。

目前,我有一个带有自定义单元格(UITableViewCell 的子类)的 UITableView。在这个自定义单元格中,有许多 UILabel 并且它们都正确设置了自动布局(固定到单元格内容视图)。这样,无论UILabel是长文本还是短文本,单元格高度都可以显示适当的高度。

问题是,当我尝试将 UILabel 之一(底部)设置为隐藏时,内容视图不会相应地调整高度,例如单元格。

我的不足是我将一个 Hight Constraint 从 Interface Builder 添加到底部标签,并带有以下内容。

Priority = 250 (Low)
Constant = 0
Multiplier = 1

这用虚线制作了约束。然后,在 Swift 文件中,我输入了以下代码。

override func viewDidLoad() 
   super.viewDidLoad()
  //Setup TableView
  tableView.allowsMultipleSelectionDuringEditing = true

  //For tableView cell resize with autolayout
  tableView.rowHeight = UITableViewAutomaticDimension
  tableView.estimatedRowHeight = 200


func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? 
 let cell = tableView.cellForRowAtIndexPath(indexPath) as! RecordTableViewCell
 cell.lbLine.hidden = !cell.lbLine.hidden
 if cell.lbLine.hidden != true
  //show
  cell.ConstrainHeightForLine.priority = 250
 else
  //not show
  cell.ConstrainHeightForLine.priority = 999


//tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)
return indexPath

棘手的是,当我调用 tableView.reloadRowAtIndexPaths() 时,单元格会显示正确的高度,但有一个错误,它必须通过双击(选择)来触发行而不是单击。

为此,我还尝试了 willSelectRowAtIndexPath 方法中的以下代码,但它们都不起作用。

cell.contentView.setNeedsDisplay()
cell.contentView.layoutIfNeeded()
cell.contentView.setNeedsUpdateConstraints()

目前结果如下(单元格高度错误):

如图 2 所示,UILabel 6 可能带有长文本,当我隐藏此视图时,内容视图仍显示为与隐藏前一样大。 请指出我错在哪里,我将不胜感激。

【问题讨论】:

您能否展示描述约束的 IB 屏幕截图?这可能会提供更好的图片。 尝试将 tableView.rowHeight = UITableViewAutomaticDimension 移动到索引路径处的行单元格,并在 willSelect 方法中重新加载 tableView。如果它不起作用,则尝试将主视图添加到覆盖整个单元格的单元格,然后添加您需要的那些标签。将该主视图固定到单元格的 4 个侧面以调整单元格的大小。希望它会有所帮助! @Shripada ,由于名声,我只能放两张 imgur 的照片,请看一下。谢谢 【参考方案1】:

我终于改代码了

tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)

到下面

tableView.reloadData()

然后,它完美地工作。 但是,我真的不知道它的确切原因。希望有人仍然可以评论它。

【讨论】:

以上是关于使用 AutoLayout 将 UIView 隐藏在单元格内时,不适合 UITableViewCell 高度的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AutoLayout 中设置 UIView 的框架?

使用 AutoLayout 将 UIView 调整为离散值

Autolayout 将 UIView 放在边距和另一个 UIView 之间

AutoLayout:如何将 UIView 限制为不高于包含其所有子视图所需的高度?

Swift + Autolayout:旋转 UILabel,保持在 UIView 旁边

如何对使用了autolayout的UIView添加动画