具有动态高度和半宽的 UICollectionview 单元格

Posted

技术标签:

【中文标题】具有动态高度和半宽的 UICollectionview 单元格【英文标题】:UICollectionview cell with dynamic height and half width 【发布时间】:2020-03-08 04:40:40 【问题描述】:

我正在尝试根据给定的文本创建具有半宽和动态高度的集合视图 (Expected View)。

我正在尝试通过(ViewController 中的代码)实现这一目标

    let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    flowLayout.estimatedItemSize = CGSize(width: (UIScreen.main.bounds.width / 2), height: 2000.0)
    flowLayout.itemSize = UICollectionViewFlowLayout.automaticSize

And(UICollectionviewCell 中的代码)

override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes 
    setNeedsLayout()
    layoutIfNeeded()
    let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)
    var frame = layoutAttributes.frame
    frame.size.height = ceil(size.height)
    layoutAttributes.frame = frame
    return layoutAttributes 

通过使用上面的代码,我可以实现创建collectionviewActual view(半宽和动态高度)。但集合视图单元格高度不等于相邻。实际上,此集合视图单元格高度应与相邻单元格高度(具有最大高度)相同。如何根据相邻单元格大小更新单元格大小?

提前致谢

【问题讨论】:

为什么要设置 UICollectionViewFlowLayout.automaticSize,评论这行试试看 这一行就够了 flowLayout.estimatedItemSize = CGSize(width: (UIScreen.main.bounds.width / 2), height: 2000.0) 试试这个,***.com/questions/35654129/… @YagneshDobariya:不走运。 你能解决这个问题吗? 【参考方案1】:

使用 UICollectionViewDelegateFlowLayout

  func collectionView(_ collectionView: UICollectionView, layout 
collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: 
IndexPath) -> CGSize 

//let padding: CGFloat =  5
    let collectionViewSize = collectionView.frame.size.width / 2
    return CGSize(width: collectionViewSize , height: 2000 )

【讨论】:

上面的代码使collectionview中的所有单元格高度为2000。这里不是这样。 您可以根据特定项目中的文本更改高度,就像我们在聊天视图中所做的那样,这可能会有所帮助***.com/questions/446405/…【参考方案2】:

将此代码添加到您的 CollectionViewCell 类中:

override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes 
    setNeedsLayout()
    layoutIfNeeded()
    let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)
    var newFrame = layoutAttributes.frame
    newFrame.size.height = ceil(size.height)
    newFrame.size.width = UIScreen.main.bounds.width / 2
    layoutAttributes.frame = newFrame
    return layoutAttributes

【讨论】:

我也试过了,但是单元格大小没有按预期更新。

以上是关于具有动态高度和半宽的 UICollectionview 单元格的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView - 如何在同一部分显示不同高度的项目?

将项目拆分为动态列的纯 CSS 解决方案

LibreOffice 4.1 Writer:调整表格列宽的宏

利用matlab摄像机标定

创建一个缩放到浏览器高度但具有设定宽度的 svg

Swift / 如何使用具有动态高度的 UITextView INSIDE UITableViewCell 与动态高度