将分页 UICollectionView 高度调整为当前可见的 UICollectionViewCell
Posted
技术标签:
【中文标题】将分页 UICollectionView 高度调整为当前可见的 UICollectionViewCell【英文标题】:Adapt paging UICollectionView height to currently visible UICollectionViewCell 【发布时间】:2020-07-16 07:11:33 【问题描述】:我有一个分页 UICollectionView,它在 UIScrollView 内具有水平 FlowLayout(上面和下面的更多内容),一次只显示一个 UICollectionViewCell。每个单元格都有全宽但动态高度。现在我想在单元格更改时调整 UICollectionView 的高度。
我已经有一个方法,当当前或下一个“页面”发生更改时,我会在其中更新 UICollectionView 的高度约束。如果下一个“页面”比上一个高,它已经可以工作,但是当下一个页面小于当前页面时,它就完全搞砸了。
GIF of current state (too big to include)
private func updateCardHeight()
guard let currentHeight: CGFloat = cardCollectionView.layoutAttributesForItem(at: currentIndexPath)?.frame.height,
let nextHeight: CGFloat = cardCollectionView.layoutAttributesForItem(at: nextIndexPath)?.frame.height
else return
let height = max(currentHeight, nextHeight)
guard cardsHeightConstraint.constant != height else return
cardsHeightConstraint.constant = height
UIView.animate(withDuration: 0.5, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 0.0, options: [], animations:
self.view.layoutIfNeeded()
, completion: nil)
在某些时候layoutAttributesForItem(at:)
失败并返回固定高度50
而不是大约。 300
。有没有人尝试过类似的东西 - 我找不到任何东西,有点迷茫。
感谢您的帮助!
【问题讨论】:
我不想出错,但我认为问题出在:guard cardsHeightConstraint.constant != height else return
。你能发布更完整的代码吗?我想尝试一下。
感谢@Gius 不幸的是,守卫不是问题,因为它只会阻止相同高度值的另一个布局更改。我把测试项目上传到了github,随意实验:github.com/hannesjung/dynamic-cards
我快速查看了代码并对其进行了调试。我注意到当从高单元格移动到低单元格(向右)时,nextPage 的值首先增加然后减少。但我还没有时间理解为什么,也许它可以帮助你解决。我在updateCardHeight
中放置了一个断点。
【参考方案1】:
@Hannes,我在您的项目中看到了问题(项目高度必须小于 UICollectionView 的高度)。有多种方法可以实现它,但目前,我可以建议修复它的最小方法。您可以实现“UICollectionViewDelegateFlowLayout”,并尝试以下代码:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
return self.cardCollectionView.frame.size
希望对你有所帮助。
【讨论】:
感谢您的检查,但这正是我想要实现的。我想将 UICollectionView 高度调整为当前聚焦的单元格,即使它比其他单元格小 @Hannes 试试这个代码。它就像您想要实现的那样工作以上是关于将分页 UICollectionView 高度调整为当前可见的 UICollectionViewCell的主要内容,如果未能解决你的问题,请参考以下文章
自动调整UICollectionView高度以调整其内容大小
如何使 UICollectionView 的高度可自动调整和滚动?
UITableViewCell内的UICollectionView如何根据屏幕大小调整tableview单元格高度