【发布时间】:2017-01-27 15:24:23
【问题描述】:
考虑以下情况。我有一个UICollectionView(在UICollectionViewController 内),它看起来与UITableView 几乎相同(我不使用UITalbeView 的原因是因为我在布局上有非数据视图,这是我不想要的管理和弄乱我的IndexPath)。
为了实现自动调整单元格大小,我设置了estimatedItemSize,如下所示:
layout.estimatedItemSize = CGSize(width: self.view.bounds.size.width, height: 72)
另外,在我的单元格中,我有布局属性:
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
layoutAttributes.bounds.size.height = systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
return layoutAttributes
}
因此,通过这样做,我得到了与 UITableView 一样的精确布局,并具有自动调整大小。而且效果很好。
现在,我正在尝试添加标题并将其固定在滚动到该部分的顶部,如下所示:
layout.sectionHeadersPinToVisibleBounds = false
但是布局进入了奇怪的状态,我到处都有小故障,单元格相互重叠,并且标题有时不粘。
更新:
view controller和cell的代码:
class ViewController: UICollectionViewController {
override func viewDidLoad() {
super.viewDidLoad()
let layout = collectionView?.collectionViewLayout as! UICollectionViewFlowLayout
layout.sectionHeadersPinToVisibleBounds = true
layout.estimatedItemSize = CGSize(width: collectionView?.bounds.size.width ?? 0, height: 36) // enables dynamic height
}
override func numberOfSections(in collectionView: UICollectionView) -> Int {
return 10
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CustomCell
cell.heightConstraint.constant = CGFloat(indexPath.row * 10 % 100) + 10 // Random constraint to make dynamic height work
return cell
}
override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
return collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "Header", for: indexPath)
}
class CustomCell : UICollectionViewCell {
let identifier = "CustomCell"
@IBOutlet weak var rectangle: UIView!
@IBOutlet weak var heightConstraint: NSLayoutConstraint!
override func awakeFromNib() {
translatesAutoresizingMaskIntoConstraints = false
}
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
layoutAttributes.bounds.size.height = systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
return layoutAttributes
}
视频滞后详情:https://vimeo.com/203284395
【问题讨论】:
-
添加一些图片以供参考将有助于我们可视化您遇到的问题
-
能否附上截图?
-
我没有答案,但部分问题可能是您基于
self.view.bounds.size.width设置layout.estimatedItemSize。如果您使用自动布局,那么width有效的地方是违反直觉的。你所做的基本上是递归的:你根据width设置一些东西,然后导致视图被调整大小,这导致width发生变化。尝试删除该循环依赖。 -
不,这是不对的。边界宽度与单元格布局无关。布局只影响单元格的大小和位置,而不影响集合视图本身的大小和位置。另外, self.view 是这里的集合视图的超级视图,所以根本不重要。它只是一个常数。
-
@PavelGatilov 添加您的 UI 图像和一些代码工作您所拥有的,以便我们可以准确估计需求并为您提供最佳答案,否则答案将是假设。
标签: ios iphone swift xcode uicollectionview