AutoSizing单元格:单元格宽度等于CollectionView
我正在使用Autolayout和UICollectionView的AutoSizing单元格。
我可以在单元初始化的代码中指定约束:
func configureCell() { snp.makeConstraints { (make) in make.width.equalToSuperview() } }
但是,由于单元格尚未添加到collectionView
,应用程序崩溃。
问题
-
在
cell
生命周期的哪个阶段,可以添加cell
width
的约束? -
是否存在制作
cell
的默认方式宽度
equal to the
collectionViewequal to the
宽度without accessing an instance of
UIScreenor
UIWindow`without accessing an instance of
?
编辑问题不重复,因为它不是关于如何使用AutoSizing单元格function,而是在单元生命周期的哪个阶段应用约束以在使用AutoLayout 时实现所需的结果。
要实现自我resize的集合视图单元,您需要做两件事:
- 在
UICollectionViewFlowLayout
上指定estimatedItemSize
- 在您的单元格上实现
preferredLayoutAttributesFitting(_:)
1.在UICollectionViewFlowLayout
上指定estimatedItemSize
此属性的默认值为CGSizeZero。 将其设置为任何其他值会导致集合视图使用单元格的preferredLayoutAttributesFitting(_ :)方法查询每个单元格的实际大小。 如果所有单元格的高度相同,请使用itemSize属性而不是此属性来指定单元格大小。
这只是一个用于计算滚动视图内容大小的估计值 ,将其设置为合理的值。
let collectionViewFlowLayout = UICollectionViewFlowLayout() collectionViewFlowLayout.estimatedItemSize = CGSize(width: collectionView.frame.width, height: 100)
2.在UICollectionViewCell
子类上实现preferredLayoutAttributesFitting(_:)
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: UILayoutPriorityRequired, verticalFittingPriority: UILayoutPriorityDefaultLow) let autoLayoutFrame = CGRect(origin: autoLayoutAttributes.frame.origin, size: autoLayoutSize) // Assign the new size to the layout attributes autoLayoutAttributes.frame = autoLayoutFrame return autoLayoutAttributes }
您需要实现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 } }
- 如何使用不同的Apple产品屏幕使文本标签缩放字体大小?
- 静默远程通知可能,如果用户已禁用推的应用程序?
- HTTPS请求无法validationiOS Safari上的证书
- 如何在Swift中使用NSURLSessionDataTask
- UITableViewCell中的UILabel可以创build一个自定义的单元格,而不需要创build单独的类
- MPMoviePlayerController仍然泄漏
- 当单击DetailDesclosurebutton时MKAnnotationView推送到视图控制器
- 如何在applicationDidBecomeActive中确定是否是最初的iPhone应用程序启动?
- 我的代码年— If(2017 isEnding){reflectAndSetNewGoals()};