【问题标题】:I'm trying to achieve this UICollectionView layout我正在尝试实现这个 UICollectionView 布局
【发布时间】:2018-01-18 20:53:01
【问题描述】:

这是我迄今为止在我的UICollectionView 中所取得的成就

这是我的UICollectionViewDelegate 函数

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    if indexPath.item % 2 == 0{

        return CGSize(width: collectionView.bounds.size.width, height: 97 * 1.5)

    }else{

        return CGSize(width: collectionView.bounds.size.width/2.0, height: 97)

    }
}

我正在寻找的是这种模式......

或者至少if indexPath.item % 2 == 0 然后创建一个单元格布局else 2 个单元格布局。

我的滚动方向只有垂直

另外,这是我删除 UICollectionViewDelegateFlowLayout 函数时得到的视图。

每行 2 个单元格。这是我需要的,但每行的宽度不同,如目标布局。

这是我的故事板原型单元

【问题讨论】:

  • "或者至少如果 indexPath.item % 2 == 0 则创建一个单元格布局,否则创建 2 个单元格布局。"不。 “目标”屏幕截图没有显示这一点。更像是:let w; let rest = indexPath.item%5 swith rest {case 0: w = allwidth; case 1: w = allWidth*1/4; case 2: w = allWidth*3/4, case (3,4): w = allWidth*1/2}
  • @Larme 是的,我理解,但问题不在于我的单元格大小,而不仅仅是它们总是每行中一个具有不同宽度的单元格。就像我添加的屏幕截图一样。如您所见,目标是一个单元格,然后是一行中的两个单元格,然后是一行中的 2 个单元格,然后是 1 个单元格,等等。
  • 应该如何适合您的样本?它不会。因为如果第一个是整个宽度,那么第二个是一半,那么第三个是整个。但是第二和第三,或第一和第二不适合“单行”。也许 %3 = 0:整个宽度,否则宽度/2。你是这个意思吗?
  • @Larme 当我删除我在 collectionViewLayout 中添加的代码时的想法,当我添加此代码或您的算法时,我会得到两个相同大小的普通单元格,是的,我得到不同大小的单元格,但只有 1 个单元格连续。
  • 你能给出你想要的布局的真正模式吗?一幅画,一幅 ASCI 艺术。因为您的代码、您的短语和您提供的图像之间并不清楚。

标签: swift uicollectionview uicollectionviewcell uicollectionviewlayout


【解决方案1】:

你在正确的轨道上,但你的逻辑很疯狂:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    if indexPath.item % 2 == 0{
        return CGSize(width: collectionView.bounds.size.width, height: 97 * 1.5)
    }else{
        return CGSize(width: collectionView.bounds.size.width/2.0, height: 97)
    }
}

为了将两个单元格放入一行,您需要两个单元格都等于或小于该行的总宽度,即小于collectionView.bounds.size.width/2.0。但在您的代码中,单元格的宽度始终为collectionView.bounds.size.width/2.0更大。稍加思考就会发现,在这种情况下,绝对没有办法将多个项目排成一行。

换一种说法:您已经展示了您的输出布局(集合视图的实际外观),并且您已经展示了您对sizeForItemAt 的实现,而前者正是我所期望的后者,所以很难看出问题所在。集合视图正在尽其所能做你告诉它做的事情。

【讨论】:

  • YESSSSSS....真的,我做到了,我现在用更新的代码添加答案谢谢。
【解决方案2】:

感谢 matt 和 Larme,我明白了我的逻辑出了什么问题,这就是我解决问题的方法。

        let width = collectionView.bounds.size.width / 1.01  //THANKS TO MATT

        //THANKS TO LARME
        let x = indexPath.item % 5
        switch x {
        case 0:
            return CGSize(width: collectionView.bounds.size.width, height: 97 * 1.5)
        case 1:
            return CGSize(width: width * 1/4, height: 97)
        case 2:
            return CGSize(width: width * 3/4, height: 97)
        case 3,4:
            return CGSize(width: width * 1/2, height: 97)
        default:
            return CGSize(width: collectionView.bounds.size.width, height: 97 * 1.5)

        }

【讨论】:

    猜你喜欢
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多