思路更简单 UICollectionView 横屏分页,cell 左右排列 ios swift

接到任务 显示分类的信息,可以有多个分类可以 选择,横向可以滑动,并可以分页。

最终 效果图


效果图第1页
效果图第2页

实现方法用UICollectionView ,每个页面是一个section,共2个section。第一个section 返回8 个Item;第二个section 也返回8个item,3个正常显示,超过3个的,显示空白 UICollectionViewCell

然而到这里 的效果却是这样,看下图

效果第1页
效果第2页

看下思路图


想要的布局

可是显示的布局却是


collectionview默认布局

下一步要怎么办?

item 1的布局 = 默认 item2 的布局就行了。整体的布局修改就行了

0246
1357 改成
0123
4567

from lizhi荔枝

原文
上代码

//
//  PageCollectionViewLayout.swift
//  VoicePlay
//
//  Created by LiZhi on 2021/7/11.
//  Copyright © 2021 Corpize. All rights reserved.
//  :https://www.jianshu.com/p/a067f5f28fab

import UIKit

class PageCollectionViewLayout: UICollectionViewFlowLayout {
    var allAttributes = [UICollectionViewLayoutAttributes]()
    override func prepare() {
        super.prepare()
        allAttributes.removeAll()
        let sectionCount = collectionView?.numberOfSections ?? 0
        for section in 0 ..< sectionCount {
            let itemCountInASection = collectionView?.numberOfItems(inSection: section) ?? 0
            for itemIndex in 0 ..< itemCountInASection {
                let indexpath = IndexPath(item: itemIndex, section: section)
                let attributes = layoutAttributesForItem(at: indexpath)
                if let attri = attributes {
                    allAttributes.append(attri)
                }
            }
        }
    }

    override func layoutAttributesForElements(in _: CGRect) -> [UICollectionViewLayoutAttributes]? {
        return allAttributes
    }

    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        let itemNew = indexPath.row
        var itemOld = itemNew
        switch itemNew {
        case 0:
            itemOld = 0
        case 1:
            itemOld = 2
        case 2:
            itemOld = 4
        case 3:
            itemOld = 6
        case 4:
            itemOld = 1
        case 5:
            itemOld = 3
        case 6:
            itemOld = 5
        case 7:
            itemOld = 7
        default:
            itemOld = itemNew
        }
        let attribute = super.layoutAttributesForItem(at: indexPath)?.copy() as? UICollectionViewLayoutAttributes
        let oldAttributes = super.layoutAttributesForItem(at: IndexPath(item: itemOld, section: indexPath.section))
        attribute?.frame = oldAttributes?.frame ?? CGRect.zero
        return attribute
    }
}



码字不易,转载请标明出处 from lizhi荔枝

你可能感兴趣的:(思路更简单 UICollectionView 横屏分页,cell 左右排列 ios swift)