首页 > 解决方案 > 在 Cell 的 UIStackView 中隐藏 subView 时动画很奇怪

问题描述

这是情况。stackView 中的标题标签、“阅读更多”按钮和内容标签。并且stackView在一个单元格中,设置Auto-Layout。tableView 的单元格高度设置为 AutoDimension。当我点击按钮时,内容标签将显示或隐藏。

按钮的动作方法是

@IBAction func readMore(_ sender: Any) {
  tableView.performBatchUpdates({
    self.contentLabel.isHidden.toggle()
  }, completion: nil)
}

这是慢动画的结果:

在此处输入图像描述

可以看到,当要显示内容时,首先呈现的是第2行,即从中心开始呈现内容。当内容要隐藏时,内容标签会立即隐藏,并且按钮会拉伸到内容标签隐藏前的框架。这个动画很奇怪。

此外,如果我将 stackView 的间距设置为 10,情况会变得更糟。标题标签也受到影响:

在此处输入图像描述

我调整了我能做的一切,stackView 的分布,三个 subView 的内容模式和内容拥抱/压缩优先级。我找不到合适的方法来解决它。

这是理想的结果:

在此处输入图像描述

我通过一种有点棘手的方式实现了它:

@IBAction func readMore(_ sender: Any) {
  tableView.performBatchUpdates({
    UIView.animate(withDuration: 0.3) { // It must be 0.3
      self.contentLabel.isHidden.toggle()
    }
  }, completion: nil)
}

我不确定这是修复它的最合适方法。所以我想知道为什么会出现这种奇怪的动画,以及是否有更合适的方法来修复它。谢谢!

标签: iosswift

解决方案


我之前不得不多次制作类似的动画。解决此问题的方法是定义堆栈视图的高度并独立定义单元格的内容视图。然后当你想要改变单元格的高度时,你只需要更新内容视图的高度约束。

确定视图高度的一个好方法是使用该intrinsicContentSize属性。如果您需要与继承的值不同的值,请覆盖它。

通知视图大小更改的另一种方法是创建一个带有委托或闭包的子类,该委托或闭包从子类视图frame属性中调用,并将新大小传递给正在侦听它的任何人。


推荐阅读