UICollectionView 每行显示 3 个项目

Posted

技术标签:

【中文标题】UICollectionView 每行显示 3 个项目【英文标题】:UICollectionView display 3 items per row 【发布时间】:2015-12-06 10:14:13 【问题描述】:

我有一个从情节提要创建的 UICollectionView,

我想在视图中每行有 3 个项目。我设法使用以下方法做到了这一点:

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

    return CGSizeMake(collectionView.frame.size.width/3.6 , (collectionView.frame.size.height-100)/2);

但是,如果我有 6 个项目,我会得到 2 行,每行 3 个项目。 但是当我有 4 个项目时,它将显示 2 行,每行 2 个项目。

是否可以将它们显示为 2 行,第一行包含 3 个项目,第二行仅包含 1 个?

【问题讨论】:

试试这个链接http://***.com/questions/14674986/uicollectionview-set-number-of-columns @PrashantTukadiya 我什么都不能用,它仍然显示 2 行,每行 2 个项目,右侧有一个空白区域(适合第一行的单元格) 试试这个***.com/questions/17229350/… 您为故事板中集合视图的单元格和行之间的间距设置了什么值? @AdeelMiraj 10 个 【参考方案1】:

我做到了,我在 UICollectionView 上实现了 UICollectionViewDelegateFlowLayout 添加以下方法。 它工作,使用它。

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenWidth = screenRect.size.width;
    float cellWidth = screenWidth / 3.0; //Replace the divisor with the column count requirement. Make sure to have it in float.
    CGSize size = CGSizeMake(cellWidth, cellWidth);

    return size;

此方法的工作原理是屏幕尺寸宽度除以 3。

【讨论】:

尝试只有4个项目,它将显示为2行,每行有2个单元格,我已经尝试过了 这里,CGSize size =CGSizeMake(100,100) 给出默认值并尝试它..(如果你可以在 iphone 6 或更高版本中尝试,请给出分辨率和设置大小的条件) 它与手机无关,当我有 6 件物品时,一切都很完美,但是当它是 4 件物品时,收藏品将每行中的物品排列为相同的编号,我不知道是不是是正常的,或者我可以以某种方式改变它 查看此链接:***.com/questions/14674986/… 尝试一下【参考方案2】:
(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

  CGRect screenRect = [[UIScreen mainScreen] bounds];
  CGFloat screenWidth = screenRect.size.width;
  float cellWidth = screenWidth / 3.2; //Replace the divisor with the column count requirement. Make sure to have it in float.
  CGFloat screenHeight = screenRect.size.height;
  float cellHeight = screenHeight/3.0;


  CGSize size = CGSizeMake(cellWidth, cellHeight);


  return size;

也应用下面的代码-(viewWillTransitionToSize)

(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
  [self.collectionView/*(that's my collection view name)*/ reloadData];

本准则将有助于获得相同的编号。纵向和横向模式下的单元格。 我已经应用上面的代码来获得 3 个纵向单元格以及 3 个横向模式单元格。

【讨论】:

【参考方案3】:

最简单的方法

UICollectionViewFlowLayout *flowLayout = (UICollectionViewFlowLayout*)collectionView.collectionViewLayout;
flowLayout.sectionInset = UIEdgeInsetsMake(15, 15, 15, 15);

NSInteger itemRowCount = 3;
CGFloat rowWidth = collectionView.contentSize.width -  flowLayout.sectionInset.left - flowLayout.sectionInset.right;
CGFloat itemWidth = (rowWidth - flowLayout.minimumInteritemSpacing * (itemRowCount - 1) ) / itemRowCount;
CGFloat itemHeight = itemWidth / 3;
flowLayout.itemSize = CGSizeMake(itemWidth, itemHeight);

【讨论】:

【参考方案4】:

试试这个

 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

    return CGSizeMake(self.view.frame.size.width/3 -10 , (collectionView.frame.size.height-100)/2);

【讨论】:

【参考方案5】:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    return CGSizeMake(self.collectionView.bounds.size.width/3, self.collectionView.bounds.size.width/3);

还需要做的最重要的事情是在 collectionView 的大小检查器中将单元格和行的最小间距设置为 0

【讨论】:

【参考方案6】:

您需要先计算内容的可用空间,然后将其除以每行要显示的项目数。

这是一个假设UICollectionView 占据屏幕的所有宽度的示例

private let numberOfItemPerRow = 2

private let screenWidth = UIScreen.main.bounds.width
private let sectionInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
private let minimumInteritemSpacing = CGFloat(10)
private let minimumLineSpacing = CGFloat(10)

// Calculate the item size based on the configuration above  
private var itemSize: CGSize 
    let interitemSpacesCount = numberOfItemPerRow - 1
    let interitemSpacingPerRow = minimumInteritemSpacing * CGFloat(interitemSpacesCount)
    let rowContentWidth = screenWidth - sectionInset.right - sectionInset.left - interitemSpacingPerRow

    let width = rowContentWidth / CGFloat(numberOfItemPerRow)
    let height = width // feel free to change the height to whatever you want 

    return CGSize(width: width, height: height)

【讨论】:

【参考方案7】:

斯威夫特 5

flowLayout.aspectRatio = 1
flowLayout.sectionInset = UIEdgeInsets(top: 2, left: 2, bottom: 2, right: 2)
flowLayout.interitemSpacing = 10
flowLayout.lineSpacing = 10
flowLayout.numberOfItemsPerLine = 4
flowLayout.scrollDirection = .vertical
self.collectionView.collectionViewLayout = flowLayout```

You can find KRLCollectionViewGridLayout library here -(https://github.com/klundberg/KRLCollectionViewGridLayout)

【讨论】:

【参考方案8】:

我知道已经很晚了,但我目前正在使用和处理这种情况的解决方案是使用 KRLCollectionViewGridLayout,如下所示

        KRLCollectionViewGridLayout* aFlowLayout = [[KRLCollectionViewGridLayout alloc]init];
        aFlowLayout.aspectRatio = 1;
        aFlowLayout.sectionInset = UIEdgeInsetsMake(2, 2, 2, 2);
        aFlowLayout.interitemSpacing = 2;
        aFlowLayout.lineSpacing = 2;
        aFlowLayout.numberOfItemsPerLine = 3;
        aFlowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;

        _collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.heigh) collectionViewLayout:aFlowLayout];

您可以使用此link 找到 KRLCollectionViewGridLayout 库类

【讨论】:

以上是关于UICollectionView 每行显示 3 个项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UICollectionView 中每行显示 3 个单元格?

UICollectionView 水平分页仅在第一页上每行显示 3 个单元格

每行 3 个项目的 UICollectionViewCell 大小

UICollectionView 行中的 2 个单元格

简单的UICollectionView显示图像表现奇怪:某些图像显示正确,有些图像位置错误,有些图像丢失

UICollectionView:删除单元格之间的空间(每行 7 个项目)