具有全宽和动态高度的Collection View单元

时间:2018-09-23 15:23:27

标签: ios swift

我正在尝试创建帖子供稿,就像您在Twitter或Facebook应用程序中看到的那样。据我了解,我应该使用Collection View,所以我已经设置好了。

但是现在,我对如何使单元格全宽和单元格高度动态感到困惑,因为单元格中的文本可以从1行到数十行不等。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

您可能需要UICollectionViewFlowLayout实例

let frame: CGRect = ...
let layout = UICollectionViewFlowLayout()
layout.estimatedItemSize = CGSize.zero
self.collectionView = UICollectionView(frame: someFrame, collectionViewLayout: layout)

关于estimatedItemSize

  

此属性的默认值为CGSizeZero。将其设置为其他任何值都会导致集合视图使用单元格的preferredLayoutAttributesFitting(_ :)方法查询每个单元格的实际大小。如果所有单元格的高度都相同,请使用itemSize属性(而不是此属性)来指定单元格大小。

然后,您可以设计UICollectionViewCell并在awakeFromNib()中添加内部约束来设置确切宽度。

然后用cell for item at index path方法进行下一步:

let cell = ... as? MyCustomCell
cell?.load(model: someModel, widthConstraint: collectionView.bounds.width)

重要的是要处理旋转和分屏模式下的视图尺寸更改:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: { _ in
        self.collectionView.collectionViewLayout.invalidateLayout()
    }) { _ in }
}

答案 1 :(得分:0)

首先需要一个UITextView. 确保禁用了滚动,并相应地设置了文本内容。为此,打开“界面生成器”,选择文本视图,然后会有一个名为“滚动视图”的部分。取消选中“滚动启用”。这非常重要,因此UITextView可以跳过滚动并根据需要拉伸内容。

ViewController:

第二,在ViewController中,您需要处理SubView Layout的更改。进行旋转或任何大小的ViewController的视图更改时,将调用此方法。

 override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        if let layout  = self.collection.collectionViewLayout as? UICollectionViewFlowLayout {
            layout.estimatedItemSize = CGSize(width: self.collection.frame.size.width-layout.sectionInset.left-layout.sectionInset.right-self.collection.contentInset.left - self.collection.contentInset.right, height: 100.0)

        }
    }

UICollectionViewCell子类:

一旦设置了esitmatedItemSize,就该提供程序preferredLayoutAttributesFitting了。您将必须重写UICollectionViewCell子类。

override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {

        layoutAttributes.size =   self.getCellHeight()

        return layoutAttributes
    }

    func getCellHeight()->CGSize{

        self.setNeedsDisplay()
        self.layoutIfNeeded()

        let size = self.contentView.systemLayoutSizeFitting(UILayoutFittingExpandedSize)
        return size
    }