UICollectionView从左到右读取多行

时间:2018-11-15 16:12:46

标签: ios swift uicollectionview uicollectionviewlayout

我正在创建一个启用分页并从左向右滚动的UICollectionView。我正在使用NSFetchedResultsController从CoreData检索结果,这意味着它使用集合视图部分而不是行。集合视图有2行,因此显示为以下屏幕截图(顺序依次为:顶行,底行,顶行,底行等)

enter image description here

但是,我需要像下面两个屏幕截图一样从左向右读取集合视图:

enter image description here enter image description here

您能建议我如何在Swift中执行此操作吗?

3 个答案:

答案 0 :(得分:0)

首先,我想如果您提供一个示例,如何对当前单元格进行分区(例如 section 0:a,b,c,d section 1:e,f ,...)以及您希望如何显示/布置不同的部分。


我建议创建一个自定义UICollectionViewLayout子类。

在prepareLayout方法中,您应该为每个单元格计算并缓存UICollectionViewLayoutAttributes。

创建变量:

let xOffset = 0.0 // leftContentInset within collectionView.bounds
let yOffsetRow0 = 0.0  // y offset of first row within collectionView.bounds
let yOffsetRow1 = 50.0 // y offset of second row within collectionView.bounds
var currentXOffset : CGFloat = xOffset
var currentPage : Int = 0
  1. 计算帧,直到第一行填充到屏幕右边缘(CGRect(currentXOffset, yOffsetRow0, cellWidth, cellHeight),增加currentXOffset)
  2. 重置currentXOffset = xOffset
  3. 使用第二行的yOffsetRow1重复1。
  4. 增加currentPage += 1
  5. 重置currentXOffset = xOffset + (collectionView.frame.width * currentPage) //用于下一页
  6. 重复步骤1-5,直到计算完所有单元格的布局

答案 1 :(得分:0)

如您所说,您需要 1.启用分页 2.从左向右滚动 3.多个部分。

这有点混淆了您到底要设计什么。如果可以共享适当的UI屏幕截图,那就更好了。

据我了解您的问题。

let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .horizontal
    let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)

检查是否已将水平布局分配给collectionView。

答案 2 :(得分:0)

我要这样做的是:

1)以与现在相同的方式对数据进行排序,以便您的集合视图如下所示:

---------
|0|2|4|6|
---------
|1|3|5|7|
---------

2)在您的集合视图数据源的cellForIndexPath方法中,返回正确的元素,以便您的集合视图变为:

---------
|0|1|2|3|
---------
|4|5|6|7|
---------

为此,您可以使用以下逻辑:

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    var elementIndex: Int!
    if indexPath.row % 2 == 0 {
        // 0 / 2 = 0
        // 2 / 2 = 1
        // 4 / 2 = 2, etc
        elementIndex = indexPath.row / 2
    }
    else {
        // (1 / 2) + round(8.0 / 2.0) = 4
        // (3 / 2) + round(8.0 / 2.0) = 5
        // (5 / 2) + round(8.0 / 2.0) = 6, etc
        elementIndex = (indexPath.row / 2) + Int(round(Double(elements.count) / 2.0))
    }

    // Dequeue your cell
    // let cell = ...

    cell.element = elements[elementIndex]
    return cell
}

基本上,这应该以正确的顺序返回元素。