【发布时间】:2021-10-04 12:29:29
【问题描述】:
我有一个垂直的UICollectionView,其中包含 5 种不同类型的单元格。其中 4 个占据了 UICollectionView 的整个宽度,因此 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 完成了工作。
另外2个大小相同,但默认位置需要更改;我希望它们从左到右对齐,而不是默认居中。
这是我设置 UICollectionView 的方式:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
switch typesOfCellsArray[indexPath.row] {
case .createVoiceRoom:
return CGSize(width: collectionView.frame.width, height: 70)
case .voiceRooms:
let height: CGFloat = content.voiceRooms.count > 3 ? 256 : 128
return CGSize(width: collectionView.frame.width, height: height)
case .seeMoreVoiceRooms:
return CGSize(width: collectionView.frame.width, height: 50)
case .newStatus:
let width = collectionView.frame.width / 4
return CGSize(width: width, height: width + 40)
case .status:
let width = collectionView.frame.width / 4
return CGSize(width: width, height: width + 40)
}
}
它们的外观如下:
这就是我想要的:
我认为我需要继承 UICollectionViewLayout 来实现这一点,但我失败了......这是我所做的:
class HomeCollectionViewLayout: UICollectionViewLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard let collectionView = collectionView else { return nil }
let layoutAttributes = super.layoutAttributesForElements(in: rect)
layoutAttributes?.forEach({ attributes in
if collectionView.cellForItem(at: attributes.indexPath) is NewHomeStatusCollectionViewCell {
let column = attributes.indexPath.row % 3
attributes.frame.origin.x = CGFloat(column-1) * attributes.frame.width
}
})
return layoutAttributes
}
}
当然,我已经将这个类设置为 UICollectionView 布局。有什么想法吗?
【问题讨论】:
-
我通过使用Mischa 的神奇模块stackoverflow.com/a/44329212/4388495完成了它
标签: swift uicollectionview uicollectionviewlayout