ios - 在 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)
}
我不确定这是修复它的最合适方法。所以我想知道为什么会出现这种奇怪的动画,以及是否有更合适的方法来修复它。谢谢!
解决方案
我之前不得不多次制作类似的动画。解决此问题的方法是定义堆栈视图的高度并独立定义单元格的内容视图。然后当你想要改变单元格的高度时,你只需要更新内容视图的高度约束。
确定视图高度的一个好方法是使用该intrinsicContentSize
属性。如果您需要与继承的值不同的值,请覆盖它。
通知视图大小更改的另一种方法是创建一个带有委托或闭包的子类,该委托或闭包从子类视图frame
属性中调用,并将新大小传递给正在侦听它的任何人。
推荐阅读
- haskell - Haskell 中的 TypeNats、ViewPatterns 和 arithmoi
- android - SharedPreferences 只保存默认值
- javascript - 比较两个约会数组并消除冲突
- c++ - 在类中将函数作为参数传递时出错
- javascript - discord.js 无限清除命令
- c# - WPF(.NET-Core):如何以编程方式将按钮背景颜色绑定到矩阵的索引值?
- c++ - 从 txt 文件中读取变量并将它们作为数组保存到类对象中 c++
- python - 将 discord bot 暴露给 API (Flask, FASTAPI)
- haskell - cabal 似乎没有注册已安装的软件包
- javascript - React Router 根据 URL 渲染信息