使用 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 放在边距和另一个 UIView 之间
AutoLayout:如何将 UIView 限制为不高于包含其所有子视图所需的高度?