UICollectionView 单元格在swift中使用约束固定宽度和动态高度

Posted

技术标签:

【中文标题】UICollectionView 单元格在swift中使用约束固定宽度和动态高度【英文标题】:UICollectionView cell fixed width and dynamic height using constraints in swift 【发布时间】:2019-09-12 05:32:20 【问题描述】:

我有一个集合视图和一个单元格,里面有一个基于其内容具有固定宽度和动态高度的单元格。我正在使用自动布局约束,我的代码如下。

我已经尝试在单元格内和视图内设置所有类型的自动约束。

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
            return 5
        

        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! ViewControllerCell

            cell.lbl_text.text = "djs sdfs sdfs dsfsfd gdgfd dfgd df "

            return cell

        



        override func viewDidLoad() 
            super.viewDidLoad()
            // Do any additional setup after loading the view.

            if let flowLayout = coll_main?.collectionViewLayout as? UICollectionViewFlowLayout 
                flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize

            



    

In cell class method:
override func awakeFromNib() 
        super.awakeFromNib()
        self.contentView.autoresizingMask = [UIView.AutoresizingMask.flexibleHeight]
    

    override func layoutSubviews() 
        self.layoutIfNeeded()
    

我在没有设置该宽度的情况下获得单元格宽度修复。这个问题怎么解决?

这里是截图。

【问题讨论】:

您必须实现sizeForItemAt 才能提供正确的大小。 【参考方案1】:

您需要确保 CollectionView 的 Estimate Size 设置为 None

【讨论】:

【参考方案2】:

请执行以下步骤

    在界面构建器中选择您的 collectionView。 去找尺寸检查员 将估计大小更改为无,如图所示。

希望它能解决问题

【讨论】:

【参考方案3】:

您可以使用 collectionView 委托

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

为此,您需要扩展 UICollectionViewDelegateFlowLayout

【讨论】:

【参考方案4】:

您必须使用UICollectionViewDelegateFlowLayout 并实现sizeForItemAt,如下所示。

// MARK: - UICollectionViewDelegateFlowLayout -
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
        let sectionInset = (collectionViewLayout as! UICollectionViewFlowLayout).sectionInset

        // Here you can set dynamic height for the individual cell according to your content size.
        let referenceHeight: CGFloat = 100 // Approximate height of your cell

        let referenceWidth = collectionView.safeAreaLayoutGuide.layoutFrame.width
            - sectionInset.left
            - sectionInset.right
            - collectionView.contentInset.left
            - collectionView.contentInset.right

        return CGSize(width: referenceWidth, height: referenceHeight)
    

这里有一篇关于它的文章,你可以关注this。

【讨论】:

【参考方案5】:

在您的集合视图中添加此属性或取消选中您笔尖中的 PrefetchingEnabled 属性。

collectionView.isPrefetchingEnabled = false

【讨论】:

【参考方案6】:

实现 UICollectionViewDelegateFlowLayout 方法以获取集合单元格大小。

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

然后转到情节提要并在尺寸检查器中将collectionView 估计尺寸设为无

【讨论】:

以上是关于UICollectionView 单元格在swift中使用约束固定宽度和动态高度的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 隐藏/防止单元格在 Sticky Header 后面滚动

UICollectionView 的单元格在滚动后并不总是刷新

UICollectionView 中的大单元格在仍显示的情况下被删除

为啥我的 UICollectionView 单元格在我的 swift ios 应用程序中不可点击?

UICollectionView 单元格在swift中使用约束固定宽度和动态高度

UICollectionView:ScrollToItem 到中心单元格在水平集合视图上不起作用