具有流式布局的 UICollectionView 不会将多个项目放在一行上

Posted

技术标签:

【中文标题】具有流式布局的 UICollectionView 不会将多个项目放在一行上【英文标题】:UICollectionView with flow layout won't put multiple items on one line 【发布时间】:2014-11-17 19:35:13 【问题描述】:

我有一个collectionView,我试图在其中创建一个网格样式布局。我现在使用的是 flowLayout 和标准 UICollectionViewCell,但我似乎无法让 collectionView 将多个项目放在同一行,因为我相信 flowLayout 默认情况下应该这样做。这是我的 collectionView 代码:

查看控制器初始化代码:

override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) 
    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .Horizontal
    collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: layout)     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    collectionView.delegate = self
    collectionView.dataSource = self
    collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell")
    collectionView.backgroundColor = UIColor.whiteColor()

查看已加载:

collectionView.frame = self.view.bounds
collectionView.reloadData()
self.view.addSubview(collectionView)

委托和数据源:

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    return 5


func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int 
    return 1


func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 
    return CGSize(width: 40, height: 40)


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as UICollectionViewCell
    func getRandomColor() -> UIColor
        var randomRed:CGFloat = CGFloat(drand48())
        var randomGreen:CGFloat = CGFloat(drand48())
        var randomBlue:CGFloat = CGFloat(drand48())
        return UIColor(red: randomRed, green: randomGreen, blue: randomBlue, alpha: 1.0)
    
    cell.backgroundColor = getRandomColor()
    return cell

这就是我得到的:

单元格不应该横向构建直到collectionView的框架边缘被击中,然后转到新行吗? 知道为什么这没有发生吗?

谢谢,

【问题讨论】:

【参考方案1】:

你有1个部分吗?

如果您有多个部分,默认情况下会将单元格移动到下一行。将节数设置为 1 并将单元格数设置为多个将解决此问题。

【讨论】:

【参考方案2】:

您确定正在调用您的提供大小的方法吗?我在您的代码中的任何地方都没有看到 layout.delegate = self 。此外,您可以在初始化时指定 itemSize

var flowLayout = UICollectionViewFlowLayout()
flowLayout.itemSize = CGSizeMake(40, 40)

另外,你真的要使用 scrollDirection = Horizo​​ntal 吗?如果是这种情况,那么您的集合视图高度应该等于项目高度,或者您需要有足够的项目来填充屏幕等等,以便它滚动

【讨论】:

以上是关于具有流式布局的 UICollectionView 不会将多个项目放在一行上的主要内容,如果未能解决你的问题,请参考以下文章

具有多个 CollectionViewLayout 的单个 UICollectionView。为啥布局混乱?

具有自定义布局的 UICollectionView 变为空白

具有特定于部分的布局和粘性标题的 UICollectionView

UICollectionView 自定义布局动画故障,在 performBatchUpdates 上具有自我调整单元格大小

以编程方式使用自动布局将子视图添加到 UICollectionView 不起作用

UICollectionView 收到具有不存在索引路径的单元格的布局属性