我正在制作一个对 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/