我一直在寻找如何让UICollectionView
在其单元格之间保持固定间距,但到目前为止尚未找到解决方案。
我有一个UICollectionView
,它由两列组成,所有单元格都有相同的宽度,但它们的高度不同。我在这个UICollectionView
中只有一个部分。
我已将最小间距设置为10(这是我在垂直单元格之间想要的值),但系统似乎是随机拉伸垂直空间。
我想要实现的是,维基百科iPad的效果是:不同的文章瓷砖具有相同的宽度,但可根据需要调整高度,但所有单元格均匀垂直的空间。 (我不介意在最后留空间,但我不想在中间留出额外的空间)
我应该如何实现这一目标?如果很容易迁移现有的UICollectionViews
(当然还有它的开源),我会接受第三方库。
答案 0 :(得分:2)
在swift 3中, 您可以在collectionView:
中为单元格间距实现此委托方法func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize{
// Give cell width and height
return CGSize(width: 750, height: 320)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat{
// splace between two cell horizonatally
return 50
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat{
// splace between two cell vertically
return 100
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets{
// give space top left bottom and right for cells
return UIEdgeInsets(top: 0, left: 100, bottom: 100, right: 100)
}
答案 1 :(得分:0)
好吧,原因毕竟是我设置的间距是单元格之间的 MINIMUM 间距。 collectionView可以使用在同一行上对齐单元格所需的任何间距,只要它不小于最小值。
答案 2 :(得分:0)
如果你想在 UICollectionView 上有固定的项目间距,你可以使用下面的自定义布局。注意:我为固定高度的单元格和 .vertical 滚动方向创建了这个布局。
class CollectionViewFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard let layoutAttributes = super.layoutAttributesForElements(in: rect) else {
return nil
}
var startX: CGFloat = 0.0
var startY: CGFloat = 0.0
let contentWidth = collectionView?.frame.width ?? 0
for layoutAttributes in layoutAttributes {
let size = layoutAttributes.size
if (startX + size.width + minimumInteritemSpacing) > contentWidth {
startX = 0
startY += size.height
startY += minimumLineSpacing
}
let origin = CGPoint(x: startX, y: startY)
let frame = CGRect(origin: origin, size: size)
layoutAttributes.frame = frame
startX += size.width + minimumInteritemSpacing
}
return layoutAttributes
}
}