InfiniteLayout 0.5

InfiniteLayout 0.5

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最后发布2021 年 7 月
SPM支持 SPM

Arnaud Dorgans 维护。




InfiniteLayout

CI Status License Platform Version Swift Package Manager compatible

示例

要运行示例项目,请克隆仓库,然后首先从 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 个数据源

RxInfiniteCollectionViewSectionedReloadDataSourceRxInfiniteCollectionViewSectionedAnimatedDataSource

绑定

无分区

// 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)

仅用于动画,请使用 RxInfiniteCollectionViewSectionedAnimatedDataSourceAnimatableSectionModel

居中的 IndexPath

RxInfiniteCollectionView 为 itemCenteredmodelCentered 提供了 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 文件。