将分页 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单元格高度

如何将 UICollectionView 项目的大小调整为具有集合视图高度的正方形大小?

在 Mat 表格中无法指定表格的高度并使页眉和页脚具有粘性

嵌套 UICollectionView 时设置 ScrollView 高度问题