动画 UITableViewCell 高度

Posted

技术标签:

【中文标题】动画 UITableViewCell 高度【英文标题】:Animate UITableViewCell height 【发布时间】:2018-07-02 07:50:40 【问题描述】:

我在 UITableViewCell 中有一个容器视图,它通过填充连接到 contentview 的 4 个边缘。我可以通过捏更改高度和填充来调整 containerView 的大小。所有约束都正确更新,但 contentView 高度没有改变。下面是 containerView 的约束。

contentView.addSubview(containerView)

containerView.translatesAutoresizingMaskIntoConstraints = false
containerViewLeadingAnchor =
containerView.leadingAnchor                 .constraint(equalTo: contentView.leadingAnchor,                         constant: 10)
containerViewTopAnchor =
containerView.topAnchor                     .constraint(equalTo: contentView.topAnchor,                             constant: 10)
containerViewBottomAnchor =
containerView.bottomAnchor                  .constraint(equalTo: contentView.bottomAnchor,                          constant: -10)
containerViewHeightAnchor =
containerView.heightAnchor                  .constraint(equalToConstant: 146)
containerViewWidthAnchor =
containerView.widthAnchor                   .constraint(equalToConstant: UIScreen.main.bounds.width - 20)

containerViewLeadingAnchor.isActive = true
containerViewTopAnchor.isActive = true
containerViewBottomAnchor.isActive = true
containerViewHeightAnchor.isActive = true
containerViewWidthAnchor.isActive = true

这就是我如何在 UITableViewCell 中更新它们

containerViewLeadingAnchor.constant     = containerPaddingForComfortable - (containerPaddingForComfortable * scaleRatio)
containerViewTopAnchor.constant         = containerPaddingForComfortable - (containerPaddingForComfortable * scaleRatio)
containerViewWidthAnchor.constant       = (UIScreen.main.bounds.width - 20) + (containerPaddingForComfortable*2 * scaleRatio)
containerViewBottomAnchor.constant      = -containerPaddingForComfortable + (containerPaddingForComfortable * scaleRatio)

containerView.layer.cornerRadius = containerCornerRadius - (containerCornerRadius * scaleRatio)
self.layoutIfNeeded()

【问题讨论】:

您是否检查过如何调整表格视图单元格的大小?内容视图由单元格控制,单元格由表格视图控制。在大多数情况下,您需要做的就是在表格视图上调用beginUpdates()endUpdates() 以刷新可见的单元格位置和大小。但在您的情况下,您可能希望避免使用表格视图。也许滚动视图上的堆栈视图会更合适。或者只是滚动视图中的一个视图。 beginUpdates() 和 endUpdates() 他骗了。谢谢你。 :) 在我兴奋中,我实际上不止一次地点击了更新按钮,现在我不能支持投票了。对不起。 :x 【参考方案1】:

仅仅修改视图框架或约束来更新内容视图的大小是不够的。

在表格视图中,单元格内容视图由单元格控制,该单元格由表格视图控制,或者更确切地说是数据源或委托。在您的情况下,您需要将单元格高度设置为自动尺寸,以便在内部使用约束来确定单元格大小。完成后,您需要在表格视图上调用beginUpdates()endUpdates()。所以像:

func resizeMyCell(_ cell: MyCell, to height: CGFloat) 
    cell.heightConstraint.constant = height
    self.tableView.beginUpdates()
    self.tableView.endUpdates()

虽然看起来很奇怪,但这两个调用会使大小无效并刷新表格视图单元格的大小和位置。顺便说一句,更改单元格大小通常意味着将其余单元格移动到调整大小的单元格下方。

【讨论】:

以上是关于动画 UITableViewCell 高度的主要内容,如果未能解决你的问题,请参考以下文章

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

动画 UITableViewCell 高度

自定义 UITableViewCell 高度会产生不正确的动画

选择后,您可以为 UITableViewCell 上的高度变化设置动画吗?

在 UITableViewCell 中为 UITableView 设置动画

UITableViewCell 折叠时展开和折叠动画不起作用