我正在使用Autolayout和UICollectionView的AutoSizing单元格。
我可以在单元初始化的代码中指定约束:
func configureCell() {
snp.makeConstraints { (make) in
make.width.equalToSuperview()
}
}
然而,由于该单元格尚未添加到collectionView
,该应用程序崩溃。
问题
在cell
生命周期的哪个阶段,可以添加一个
约束cell
的{{1}}?
是否有任何默认方式可以width
cell
宽度宽度
equal to the
collectionView of the
UIScreen without accessing an instance of
UIWindow`?
修改 问题不是重复,因为它不是关于如何使用AutoSizing单元格功能,而是在单元格生命周期的哪个阶段应用约束来实现所需的结果 使用AutoLayout时。
答案 0 :(得分:24)
要实现自我调整大小的集合视图单元,您需要做两件事:
estimatedItemSize
UICollectionViewFlowLayout
preferredLayoutAttributesFitting(_:)
estimatedItemSize
UICollectionViewFlowLayout
此属性的默认值为CGSizeZero。将其设置为任何其他值会导致集合视图使用单元格的preferredLayoutAttributesFitting(_ :)方法查询每个单元格的实际大小。如果所有单元格的高度相同,请使用itemSize属性而不是此属性来指定单元格大小。
这是只是一个估计,用于计算滚动视图的内容大小,将其设置为合理的。
let collectionViewFlowLayout = UICollectionViewFlowLayout()
collectionViewFlowLayout.estimatedItemSize = CGSize(width: collectionView.frame.width, height: 100)
preferredLayoutAttributesFitting(_:)
子类UICollectionViewCell
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
let autoLayoutAttributes = super.preferredLayoutAttributesFitting(layoutAttributes)
// Specify you want _full width_
let targetSize = CGSize(width: layoutAttributes.frame.width, height: 0)
// Calculate the size (height) using Auto Layout
let autoLayoutSize = contentView.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: UILayoutPriority.required, verticalFittingPriority: UILayoutPriority.defaultLow)
let autoLayoutFrame = CGRect(origin: autoLayoutAttributes.frame.origin, size: autoLayoutSize)
// Assign the new size to the layout attributes
autoLayoutAttributes.frame = autoLayoutFrame
return autoLayoutAttributes
}
答案 1 :(得分:0)
您需要实施sizeForItemAt:来计算尺寸。
我们还使用了"尺寸调整单元"如果你的细胞高度可变。例如:
class MyFancyCell: UICollectionViewCell {
class func cellSize(_ content: SomeContent, withWidth width: CGFloat) -> CGSize {
sizingCell.content = content
sizingCell.updateCellLayout(width)
return sizingCell.systemLayoutSizeFitting(UILayoutFittingExpandedSize)
}
fileprivate static let sizingCell = Bundle.main.loadNibNamed("ContentCell", owner: nil, options: nil)!.first as! ContentCell
func updateCellLayout(width: CGFloat) {
//Set constraints and calculate size
}
}