如何让 UICollectionView 连续水平滚动而不是创建第二行?

Posted

技术标签:

【中文标题】如何让 UICollectionView 连续水平滚动而不是创建第二行?【英文标题】:How do I get UICollectionView to continuously scroll horizontally instead of creating a second row? 【发布时间】:2020-03-24 13:45:18 【问题描述】:

为了防止 UICollectionView 在我的水平集合视图中创建第二行,调整 UICollectionView 的宽度以匹配单元格数量 * 它们的宽度的正确方法是什么。

是否有特定的方法可以为 CollectionView 实现以允许我进行设置?

目前的样子:

目前,我正在实现以下方法:

func numberOfSections(in collectionView: UICollectionView)

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int)

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath)

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewDelegateFlowLayout, sizeForItemAt indexPath: IndexPath)

【问题讨论】:

如果你为collectionview设置了一个固定高度,只有一行可以垂直放置,那么你将拥有单行可滚动的水平collectionview。 【参考方案1】:

首先将你的collectionView FlowLayout scrollDirection 设置为水平。

let myColl:UICollectionView = 
    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .horizontal
    let coll = UICollectionView(frame: .zero, collectionViewLayout: layout)
    return coll
()

然后将您的collectionview高度约束设置为等于(或稍微大于)单元格高度

myColl.heightAnchor.constraint(equalToConstant: 50).isActive = true

在这里设置你的单元格大小

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
        return CGSize(width: view.frame.width-32, height: 50)
    

【讨论】:

【参考方案2】:

对于任何想知道的人,Dilan 的回答也适用于使用 Storyboard 创建和链接的 UICollectionView。

只需按照 Dilan 在您的 viewDidLoad() 函数中建议的操作即可。

override func viewDidLoad()  myColl.heightAnchor.constraint(equalToConstant: 50).isActive = true 

确保您的类(如果还不是 UICollectionViewController)是 UICollectionViewFlowDelegate 的子类。

class MyClass: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout 

如果不这样做,

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
    return CGSize(width: view.frame.width-32, height: 50)

不会被调用。

【讨论】:

以上是关于如何让 UICollectionView 连续水平滚动而不是创建第二行?的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 水平滚动

用连续卷轴查看;水平和垂直

UITableView中的多个UICollectionView在滚动中交织在一起

如何检测滚动到水平 UICollectionView 的末尾

如何水平居中 UICollectionView 单元格?

如何滚动到 UICollectionView 的中心(水平和垂直)