维护您的数据源并返回 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
}
}