如何根据数据更改 UICollectionView 单元格宽度

How to change UICollectionView Cell width base on data

我有一个 UICollectionView,其单元格仅包含一个标签。我已经实现它工作正常,但一些字符串值设置为单元格内的标签被切掉了。检查下图。

Select 单元格应显示为 "Day Before Yesterday"。如果有办法根据数据长度调整单元格宽度,我可以解决这个问题。可能吗 ?

PS: 一些类似的问题在下面的方法中提出。所以我试过了,但没有运气。

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

        if(collectionView == dateRangeCollectionView){
            return (dateRanges[indexPath.item] as NSString).size(attributes: nil)
        }else{
            return (OrderStatus[indexPath.item] as NSString).size(attributes: nil)
        }
    }

我不认为这种方法甚至存在于 swift 4. 当我开始输入时 "sizeForItemAt" Xcode 没有建议这种方法。

要计算每个单元格的大小,您需要计算出文本的宽度,还要考虑给定的填充。使用它来获取单元格的宽度,以及 return sizeForItem 委托中的值。

func labelSizeWithString(text: String,fontSize: CGFloat, maxWidth : CGFloat) -> CGRect{
let font = UIFont.systemFontOfSize(fontSize)
let label = UILabel(frame: CGRectMake(0, 0, maxWidth, CGFloat.max))
label.numberOfLines = 0
label.font = font
label.text = text

label.sizeToFit()

return label.frame

}

如果您希望文本显示在一行或两行中,请使用 numberOfLines 选项。 对于您获得的宽度,添加适当的填充值。

请使用自调整单元格。请按照以下步骤获取更多信息

只有流式布局支持自动调整单元格大小,因此请确保这就是您使用的内容。

按照以下步骤操作:

  1. 在 UICollectionViewFlowLayout 上设置 estimatedItemSize

  2. 添加对单元格子类(自动版式)调整大小的支持。 More info here.

检查此 github 回购:SelfSizingCollectionViewCell