swift - 无限滚动组合布局 Swift

标签 swift uikit

我正在制作一个对 Collection View 使用组合布局的应用程序,我有一个水平显示元素的轮播布局。

let itemSize = NSCollectionLayoutSize(widthDimension: .absolute(100), heightDimension: .absolute(100))
    let item = NSCollectionLayoutItem(layoutSize: itemSize)
    item.contentInsets = NSDirectionalEdgeInsets(top: 2, leading: 2, bottom: 2, trailing: 2)
    let groupSize = NSCollectionLayoutSize(widthDimension: .absolute(100), heightDimension: .fractionalWidth(1 / 3))
    let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
    group.contentInsets = .init(top: 4, leading: 0, bottom: 4, trailing: 0)
    let section = NSCollectionLayoutSection(group: group)
    section.orthogonalScrollingBehavior = .continuous

如何实现无限滚动,即每次获得最后一个元素时,它都会返回到第一个元素并继续滚动? (现在它可以工作,我可以滚动元素,但每次显示最后一个元素时,我都必须以另一种方式向后滚动)

我已经看到很多方法可以使用旧的 CollectionView 系统来实现此目的,但我想继续使用新方法

最佳答案

维护您的数据源并返回 Int16.max 或任何大数,并执行简单的模运算,以将您的项目从数据源获取到模型中的可重用单元出列

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var collectionView: UICollectionView!

var sections: [Int] = Array(0...7)
var models: [[Int]] = Array(repeating: [1,2,3,4,5,6,7,8], count: 8)

var sectionCellColors: [Int: UIColor] = [
    0 : .blue,
    1 : .red,
    2 : .green,
    3 : .yellow,
    4 : .magenta,
    5 : .brown,
    6 : .gray,
    7 : .black
]

override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.backgroundColor = .cyan
    let layout = createLayout()
    collectionView.setCollectionViewLayout(layout, animated: false)
}

func createLayout() -> UICollectionViewCompositionalLayout {
    let layout = UICollectionViewCompositionalLayout { sectionNum, environment in
        let item = NSCollectionLayoutItem(
            layoutSize: NSCollectionLayoutSize(
                widthDimension: .fractionalWidth(0.2),
                heightDimension: .fractionalHeight(1)))
        item.contentInsets = .init(top: 8, leading: 8, bottom: 8, trailing: 8)
        let group = NSCollectionLayoutGroup.horizontal(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(300)), subitems: [item])
        let section = NSCollectionLayoutSection(group: group)
        section.orthogonalScrollingBehavior = .continuous
        return section
    }
    return layout
}

override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
    if context.nextFocusedView?.isKind(of: UICollectionViewCell.self) == true {
        context.nextFocusedView?.layer.borderColor = UIColor.purple.cgColor
        context.nextFocusedView?.layer.borderWidth = 2
    }
    if context.previouslyFocusedView?.isKind(of: UICollectionViewCell.self) == true {
        context.nextFocusedView?.layer.borderColor = UIColor.clear.cgColor
        context.nextFocusedView?.layer.borderWidth = 0
    }
}
}

extension ViewController: UICollectionViewDataSource {

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return Int(Int16.max)
//        return sections.count
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return models[section % sections.count].count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellID", for: indexPath)
    cell.backgroundColor = sectionCellColors[indexPath.section % sections.count]
    return cell
}
}

关于swift - 无限滚动组合布局 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71754697/

相关文章:

dictionary - 快速将 AnyObject 转换为字典

image - 如何判断PFFile是Video还是Image?

ios - 您的凭据不允许访问此资源 Twitter API 错误

cocoa-touch - UI 附件元素、附件框架和屏幕旋转损坏

ios - 如何将 UIGestureRecognizer 限制为特定的 UIView?

iphone - 这个警告是什么意思 : "setting the first responder view of the collection view but we don' t know its type (cell/header/footer)"

ios - 为什么在进行本地搜索时会收到 MKErrorDomain 错误?

ios - 传递闭包稍后调用

cocoa-touch - iPhone - 使标签栏透明

ios - 是否可以在 UIPageViewController 中以编程方式翻页?