InfiniteLayout
示例
要运行示例项目,请克隆仓库,然后首先从 Example 目录运行 pod install
。
安装
CocoaPods
InfiniteLayout 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod 'InfiniteLayout'
Swift Package Manager
创建一个 Package.swift
文件。
// swift-tools-version:5.0
import PackageDescription
let package = Package(
name: "InfiniteLayoutTestProject",
dependencies: [
.package(url: "https://github.com/arnauddorgans/InfiniteLayout.git", from: "0.4.2")
],
targets: [
.target(name: "InfiniteLayoutTestProject", dependencies: ["InfiniteLayout"])
]
)
使用方法
@IBOutlet weak var collectionView: InfiniteCollectionView!
InfiniteCollectionView 不需要其他的代理或数据源,只需像在其他 UICollectionView 中使用一样使用 UICollectionViewDataSource 和 UICollectionViewDelegate。
InfiniteLayout 提供了三个类来实现无限滚动
InfiniteLayout:一个 UICollectionViewFlowLayout
InfiniteCollectionView:一个具有 InfiniteLayout 的 UICollectionView
InfiniteCollectionViewController:一个具有 InfiniteCollectionView 的 UICollectionViewController
IndexPath
InfiniteCollectionView 可能会创建假的 IndexPath,
要获取实际的 IndexPath,请调用
func indexPath(from infiniteIndexPath: IndexPath) -> IndexPath
要获取实际的 section,请调用
func section(from infiniteSection: Int) -> Int
Paging
InfiniteCollectionView 提供了分页功能,您可以通过设置 isItemPagingEnabled 标志为 true 来启用它
self.infiniteCollectionView.isItemPagingEnabled = true
当 isItemPagingEnabled 标志启用时,您可以通过设置 velocityMultiplier 来调整减速度,值越高,减速越慢
self.infiniteCollectionView.velocityMultiplier = 1 // like scrollView with paging (default value)
self.infiniteCollectionView.velocityMultiplier = 500 // like scrollView without paging
当 isItemPagingEnabled 标志启用时,您可以设置一个 preferredCenteredIndexPath,此值用于每次CollectionView更改其内容大小时计算首选可见单元格以居中
self.infiniteCollectionView.preferredCenteredIndexPath = [0, 0] // center the cell at [0, 0] if visible (default value)
self.infiniteCollectionView.preferredCenteredIndexPath = nil // center the closest cell from center
Delegate
InfiniteCollectionView 提供了一个 infiniteDelegate 协议,用于获取居中的 IndexPath,如果您想使用 InfiniteCollectionView 作为 Picker 的话,这将很有用。
func infiniteCollectionView(_ infiniteCollectionView: InfiniteCollectionView, didChangeCenteredIndexPath from: IndexPath?, to: IndexPath?)
Rx
InfiniteCollectionView 提供了一个 subspec InfiniteLayout/Rx
pod 'InfiniteLayout/Rx'
为了在使用 InfiniteCollectionView 与 RxSwift 时避免 NSProxy 之间的冲突
使用 RxInfiniteCollectionView 代替 InfiniteCollectionView
@IBOutlet weak var collectionView: RxInfiniteCollectionView!
RxInfiniteCollectionView 为 SectionModel 提供了 2 个数据源
RxInfiniteCollectionViewSectionedReloadDataSource 和 RxInfiniteCollectionViewSectionedAnimatedDataSource
绑定
无分区
// automatic cell dequeue
Observable.just(Array(0..<2))
.bind(to: infiniteCollectionView.rx.items(cellIdentifier: "cell", cellType: Cell.self, infinite: true)) { row, element, cell in
cell.update(index: row) // update your cell
}.disposed(by: disposeBag)
// custom cell dequeue
Observable.just(Array(0..<2))
.bind(to: infiniteCollectionView.rx.items(infinite: true)) { collectionView, row, element in
let indexPath = IndexPath(row: row, section: 0)
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! Cell // dequeue your cell
cell.update(index: row) // update your cell
return cell
}.disposed(by: disposeBag)
有分区
let dataSource = RxInfiniteCollectionViewSectionedReloadDataSource<SectionModel<Int, Int>>(configureCell: { dataSource, collectionView, indexPath, element in
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! Cell // dequeue your cell
cell.update(index: indexPath.row) // update your cell
return cell
})
Observable.just([
SectionModel(model: 0, items: Array(0..<2)),
SectionModel(model: 1, items: Array(0..<10))
])
.bind(to: infiniteCollectionView.rx.items(dataSource: dataSource))
.disposed(by: disposeBag)
仅用于动画,请使用 RxInfiniteCollectionViewSectionedAnimatedDataSource 和 AnimatableSectionModel
居中的 IndexPath
RxInfiniteCollectionView 为 itemCentered 和 modelCentered 提供了 React 便捷扩展
infiniteCollectionView.rx.itemCentered
.asDriver()
.drive(onNext: { [unowned self] indexPath in
self.selectedView.update(index: indexPath.row) // update interface with indexPath
}).disposed(by: disposeBag)
infiniteCollectionView.rx.modelCentered(Int.self)
.asDriver()
.drive(onNext: { [unowned self] element in
self.selectedView.update(index: element) // update interface with model
}).disposed(by: disposeBag)
作者
Arnaud Dorgans, [email protected]
许可
InfiniteLayout 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。