我正在尝试创建帖子供稿,就像您在Twitter或Facebook应用程序中看到的那样。据我了解,我应该使用Collection View
,所以我已经设置好了。
但是现在,我对如何使单元格全宽和单元格高度动态感到困惑,因为单元格中的文本可以从1行到数十行不等。
我该怎么做?
答案 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
}