如何根据swift中的标签文本更改CollectionView单元格宽度

Swi*_*ift 2 label width uicollectionview swift

我需要根据其标签文本更改 CollectionView 单元格宽度,如下所示

在此输入图像描述

为此,我给出了 CollectionView 约束

top, leading, trailing, = 10 height = 80
Run Code Online (Sandbox Code Playgroud)

在单元格中,我在 uiview 中放置了标签,我放置了 uiview 因为我需要给角半径

和代码

class SearchFilterVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {


var textArray = ["hbdhwebhj", "behgwfhjewgbkfjbe", "hbhjs", "bdhsbfhegu", "gwdgyqwuguq"]


@IBOutlet weak var collectionView: UICollectionView!
override func viewDidLoad() {
    super.viewDidLoad()

           let layout = UICollectionViewFlowLayout()
            layout.scrollDirection = .horizontal
            layout.minimumInteritemSpacing = 0
            layout.minimumLineSpacing = 5
            self.collectionView.collectionViewLayout = layout        
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return textArray.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SearchFilterCollectionViewCell", for: indexPath as IndexPath) as! SearchFilterCollectionViewCell
       
    
    cell.textLabel.text = textArray[indexPath.row]
        return cell
}
}
Run Code Online (Sandbox Code Playgroud)

编辑:

在此输入图像描述

输出/输出

在此输入图像描述

如何解决这个问题,请提供代码帮助

San*_*ari 6

CollectionView 中的所有项目都采用完全相同的大小,因为您已指定layout.itemSizeCollectionView 的流布局

消除layout.itemSize = CGSize(width: self.collectionView.frame.size.width / 2, height: 80)

代码中的其他问题:

  1. layout.invalidateLayout()是不必要的ViewDidLoad
  2. if let layout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {设置minimumInteritemSpacingandminimumLineSpacing是不必要的,在您创建的上面的声明中,let layout = UICollectionViewFlowLayout()为什么不简单地设置minimumInteritemSpacingandminimumLineSpacing本身呢?为什么要使用额外的if let

简单地写

        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
        layout.minimumInteritemSpacing = 0
        layout.minimumLineSpacing = 5
        self.collectionView.collectionViewLayout = layout
Run Code Online (Sandbox Code Playgroud)

您无需指定项目大小,集合视图流布局本质上设置为水平,因此默认情况下,如果单元格内只有一个标签并且设置了自动布局,则每个项目将采用与集合视图高度相同的高度正确约束,标签的固有内容大小将确保单元格获得适当的宽度

在此输入图像描述

无论出于何种原因,如果您决定将标签包装在UIView上面的逻辑中,只要您正确设置标签的自动布局约束,labell 的内在内容大小将设置 containerView 的宽度,这反过来又有助于设置单元格的宽度适当地,

这里单元格的背景颜色为红色,容器视图的背景颜色为橙色,标签没有背景颜色,我在单元格和视图之间添加了前导和尾随间距为 10,标签和容器视图的前导和尾随间距为 5

在此输入图像描述

编辑:

由于OP要求容器视图、标签和单元格之间的约束,我正在更新答案以反映相同的内容

在此输入图像描述

清楚地

  - - - - - - - - - - - - Cell - - - - - - - - - - - - - - - -
|       - - - - - - - - Container View - - - - - - - -          |
|     |                      |5                          |      |   
|-10- |-5-                  Label                     -5-| -10- |   
|     |                      |5                          |      |
|       - - - - - - - - - - - - - - - - - - - - - - - - -       |
|                                                               |
  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  

Run Code Online (Sandbox Code Playgroud)

如果需要,您可以在单元格和容器之间添加顶部和底部约束,但我已将容器视图保持垂直居中于单元格

怎么运行的?

标签具有从设置给它的文本中获取的内在内容大小,视图确实根据其子视图的大小获取其内在大小,因为容器视图中没有子视图,它从标签获取其大小,显然无论size label 返回视图将宽度增加 10,将高度增加 10(5 个前导,5 个尾随,5 个顶部和 5 个底部)最后单元格从其子视图中获取其大小,因为只有一个子视图(容器视图)它从容器视图中获取宽度对于高度,它从集合视图获取其高度(因为子视图没有提供足够的数据来计算其高度)

如果由于某种原因(可能是由于您有意/无意地设置了一些其他约束,例如在容器视图上添加宽度约束)标签未正确获取其内在内容大小,您始终可以在单元格唤醒时将setContentCompressionResistancePrioritysetContentHuggingPriority标签设置为高从笔尖

override func awakeFromNib() {
        super.awakeFromNib()
        self.label.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
        self.label.setContentHuggingPriority(.defaultHigh, for: .horizontal)
 }
Run Code Online (Sandbox Code Playgroud)

虽然在通常情况下不需要这样做,但如果需要获得正确的内在大小,则必须存在一些其他限制,这些限制会阻止标签采用正确的隐式内在内容大小,如果我处于您的位置,则宁愿检查和修复首先。尽管如此,无法使用您提供的有限代码进一步调试。

编辑2:

没有意识到OP正在使用自定义实例UICollectionViewFlowLayout并且尚未将estimatedItemSize属性设置为automaticSize

        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
        layout.minimumInteritemSpacing = 0
        layout.minimumLineSpacing = 5
        layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
        self.collectionView.collectionViewLayout = layout
Run Code Online (Sandbox Code Playgroud)