UICollectionView 从左到右读取多行

Posted

技术标签:

【中文标题】UICollectionView 从左到右读取多行【英文标题】:UICollectionView to read from left to right with multiple rows 【发布时间】:2018-11-15 16:12:45 【问题描述】:

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

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

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

【问题讨论】:

所以 b 有 IndexPath(row: 1, section: 0) ? @marosoaie 我已经用更多信息编辑了我的问题。但基本上我使用的是使用集合视图部分的 NSFetchedResultsController。 那么也许您需要对数据进行排序,使其与您想要达到的顺序相匹配? iirc 流式布局使单元格从左到右移动,当没有更多空间时,下一行开始,依此类推,所以你只能通过设置排序来获得它获取请求上的描述符 你能用 a、b、c、d、e、f、g 等代替 IndexPath 值吗?最后的截图也是第2页的预览吗? 【参考方案1】:

我会这样做:

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

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

【讨论】:

您好,感谢您的帮助。您的第二个解决方案一半有效,唯一的问题是我在集合视图中有多个页面,并且进行了上述更改,集合视图现在看起来像 0-1-2-3 4-5-6-7 8-9-顶行 10-11,底行 12-13-14-15 16-17-18-19 20-21-22-23 哦!我刚刚意识到:你想在第一页的第一行走 0-1-2-3,然后在第一页的第二行走 4-5-6-7,然后对第二页做同样的事情:第 1 行 8-9-10-11 和第 2 页第 2 行 12-13-14-15... 是这样吗?如果是这样,是的,我的解决方案没有这样做:( 是的,这就是我需要的阅读方式!啊,不用担心,感谢您的帮助! 嗨@AdamAltinkaya,你的问题已经回答了吗?,你也可以分享一下吗?因为我有同样的情况【参考方案2】:

首先,我认为如果您提供一个当前如何对单元格进行分区的示例(例如,第 0 节:a、b、c、d第 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
    计算帧数,直到第一行填充到屏幕右边缘(CGRect(currentXOffset, yOffsetRow0, cellWidth, cellHeight),增加 currentXOffset) 重置currentXOffset = xOffset 重复 1. 第二行使用 yOffsetRow1 递增currentPage += 1 重置currentXOffset = xOffset + (collectionView.frame.width * currentPage) // 下一页 重复步骤 1-5,直到计算出所有单元格的布局

【讨论】:

【参考方案3】:

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

您到底想要设计什么有点令人困惑。如果能分享合适的UI截图就更好了。

据我了解您的问题。

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

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

【讨论】:

以上是关于UICollectionView 从左到右读取多行的主要内容,如果未能解决你的问题,请参考以下文章

如何从左到右对齐集合视图单元格?

多行的动画文字下划线(从左到右绘制动画)

从左到右读取对象

如何防止在水平滚动方向上从左到右滚动集合视图?

如何让 div 的内容从左到右,然后 drop e 继续从左到右

jQuery FadeIn 从左到右