为 collectionView 中的每个其他项目设置特定布局

Posted

技术标签:

【中文标题】为 collectionView 中的每个其他项目设置特定布局【英文标题】:Set specific layout for every other item inside collectionView 【发布时间】:2018-08-29 23:34:26 【问题描述】:

我有一个带有自定义单元格的 collectionView。我想在我的单元格中使用特定的布局来布局 imageView,但它的布局不正确。

第 1 行和第 3 行布局正确,但第 2 行布局不正确。正确的布局应该是中间的每张图片都应该低于两端的其他两张。

问题在 CollectionViewCell 内部,我使用模数将每个奇数单元格设置为低于每个偶数单元格,但由于第二行(或每个奇数行)中间单元格的模数将始终是偶数布局布局正确,但没有给我想要的。

我怎样才能让布局看起来像下图?

代码:

override func viewDidLoad() 
    super.viewDidLoad()

    let layout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsetsMake(15, 0, 5, 0)
    layout.scrollDirection = .vertical

    collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.translatesAutoresizingMaskIntoConstraints = false
    // collectionView datasource, delegate, and cell registration set
    view.addSubview(collectionView)

    collectionView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
    collectionView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
    collectionView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 5).isActive = true
    collectionView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -5).isActive = true


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


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! CustomCell

    cell.item = indexPath.item
 

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

    let width = (view.frame.width - 25) / 3
    return CGSize(width: width, height: width)


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat 
    return 25


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat 
    return 5

这是我用来设置布局的 CollectionViewCell 中的代码:

class CustomCell: UICollectionViewCell 

    var item: Int = 0 
        didSet 
             setLayout()
        
    

    func setLayout() 
        addSubview(imageView)

        imageView.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
        imageView.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true

        if item % 2 == 0 

            imageView.topAnchor.constraint(equalTo: self.topAnchor, constant: -10).isActive = true
            imageView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -10).isActive = true

         else 

            imageView.topAnchor.constraint(equalTo: self.topAnchor, constant: 10).isActive = true
            imageView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 10).isActive = true
        
    

【问题讨论】:

【参考方案1】:

您似乎想检查if (item + 1) % 3 == 2,然后将单元格向下移动。这是编辑后的代码:

   if (item + 1) % 3 == 2 
        imageView.topAnchor.constraint(equalTo: self.topAnchor, constant: 10).isActive = true
        imageView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 10).isActive = true

     else 

        imageView.topAnchor.constraint(equalTo: self.topAnchor, constant: -10).isActive = true
        imageView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -10).isActive = true
    

【讨论】:

它没有用。它将每 3 个单元格向上推。每行的前两个单元格在同一级别,但第三个单元格更高【参考方案2】:

让我们看看....您要移动的项目是 2 ,5 和 8...+3

所以...试试....

if item == 2 
    imageView.topAnchor.constraint(equalTo: self.topAnchor, constant: 10).isActive = true
    imageView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 10).isActive = true

 
if (item - 2 ) % 3 == 0
imageView.topAnchor.constraint(equalTo: self.topAnchor, constant: 10).isActive = true
    imageView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 10).isActive = true
  else 
    imageView.topAnchor.constraint(equalTo: self.topAnchor, constant: -10).isActive = true
    imageView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -10).isActive = true

// 你知道我要去哪里吗?您的规则的例外是 2。您需要调整每个 2 + 3(n) 单元格。

// so if item = 2; process code
// if item = 5: minus it by 2; item = 3 which % 3 == 0
// if item = 8: minus it by 2; item = 6 which % 3 == 0

// and so on. 
// hope you understand now, I'm not very good at explaining, 

【讨论】:

我会在早上通读你的答案。这里是晚上 11 点 30 分。谢谢,即使我发现接受的答案一点点都有帮助:) 没关系!我的答案和 Leo Fengs 一样(除了他的更简单)!我没有刷新我的浏览器,所以它没有显示正确的答案。他使用加法,而我使用减法 :) 我希望在我们的解释之后你能明白为什么它会关闭:)

以上是关于为 collectionView 中的每个其他项目设置特定布局的主要内容,如果未能解决你的问题,请参考以下文章

错误 此 PlotModel 已被 OxyPlot 图表中的某些其他 PlotView 控件使用

如何以编程方式选择collectionview中的项目?

CollectionView 不同的单元格选择

TableViewCell 内的 CollectionView

Swift:跳转到 CollectionView 中的下一个文本字段

SWIFT 3:将不同的声音文件数组匹配到 CollectionView 中的每个部分