我正在将AutoSizing单元格与Autolayout和UICollectionView一起使用。
我可以在单元初始化的代码中指定约束:
func configureCell() { snp.makeConstraints { (make) in make.width.equalToSuperview() } }
但是,由于该单元尚未添加到中,该应用程序崩溃了collectionView。
collectionView
问题
在该阶段cell的生命周期,可以添加一个约束cell的width?
cell
width
有没有作出任何默认方式cell的`宽度equal to the 宽of the的CollectionViewwithout accessing an instance of UIScreenorUIWindow?
`宽度
宽
的CollectionView
UIScreen
UIWindow
编辑 这个问题不是重复的,因为它不是关于如何使用AutoSizing单元格功能,而是关于在单元生命周期的哪个阶段应用约束以 在 使用AutoLayout 时 获得所需结果的问题。
要实现自动调整大小的集合视图单元,您需要做两件事:
estimatedItemSize
UICollectionViewFlowLayout
preferredLayoutAttributesFitting(_:)
此属性的默认值为CGSizeZero。将其设置为任何其他值会使集合视图使用单元格的preferredLayoutAttributesFitting(_ :)方法查询每个单元格的实际大小。如果所有单元格的高度都相同,请使用itemSize属性(而不是此属性)来指定单元格大小。
这 只是一个估算值 ,用于计算滚动视图的内容大小,并将其设置为合理的值。
let collectionViewFlowLayout = UICollectionViewFlowLayout() collectionViewFlowLayout.estimatedItemSize = CGSize(width: collectionView.frame.width, height: 100)
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 }