ios - UICollectionViewCell - 当其内容改变时动画单元格高度改变
问题描述
我有一个非常简单UICollectionView
的,使用 iOS 13 的UICollectionViewCompositionalLayout
. 单元格有一个垂直UIStackView
的,当你按下“切换细节”按钮时,我简单地改变isHidden
了detailsView
. 当单元格然后通知视图控制器它需要执行collectionView.collectionViewLayout.invalidateLayout()
时,基本上一切正常:详细信息视图被打开和关闭。但它不会对此进行动画处理,因此看起来有点刺耳。
class ViewController: UIViewController {
@IBOutlet private var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
collectionView.collectionViewLayout = createLayout()
}
private func createLayout() -> UICollectionViewLayout {
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(200))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(200))
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
let section = NSCollectionLayoutSection(group: group)
section.contentInsets = .init(top: 16, leading: 16, bottom: 16, trailing: 16)
section.interGroupSpacing = 16
let layout = UICollectionViewCompositionalLayout(section: section)
return layout
}
}
extension ViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! Cell
cell.resize = { [weak self] in
UIView.animate(withDuration: 2) {
self?.collectionView.collectionViewLayout.invalidateLayout()
}
}
return cell
}
}
class Cell: UICollectionViewCell {
@IBOutlet private var detailsView: UIView!
var resize: (() -> Void)?
override func awakeFromNib() {
super.awakeFromNib()
contentView.layer.cornerRadius = 10
}
@IBAction private func toggleDetails() {
detailsView.isHidden.toggle()
resize?()
}
}
复制项目:https ://github.com/kevinrenskers/CellHeight 。
我怎样才能动画这个细节视图的切换,以便高度变化动画?并且可以UIStackView
与显示/隐藏其子视图结合使用吗?请注意,细节视图在现实世界的应用程序中没有固定的高度,所以我不能只在两个固定值之间切换单元格高度。
解决方案
随着集合视图的动画化,我将您的存储库提供给您并进行一些更改。
https://github.com/lebaotrung93/CellHeight
有用。CollectionView
但是对于 UIStackView,由于其自身的行为,似乎很难管理它的大小。
推荐阅读
- c# - 如何读取 Pem 证书和私钥文件并创建 Bouncy Castle X509Certificate 和 Bouncy Castle AsymmetricKeyParameter dotnet 核心?
- google-apps-script - Google 电子表格和条件复选框
- r - 在R中获取两个文件之间的交集
- c# - 如何遍历 XML 文件中的复杂 XML 节点并根据具有标记元数据属性的列表选择值?
- swift - 如何取消选择选定的表单(UITableView)单元格 - SwiftUI
- c# - 如何将 Microsoft.DotNet.Arcade.Sdk 安装到 dotnet sdk 文件夹中?
- powershell - PowerShell - 在变量名称中使用动态创建的变量名称
- java - 如何在 android 10 中创建目录?
- c++ - 无法理解 C++ 流
- c - 为什么显示错误参数已初始化