CarouselSwift 1.5

CarouselSwift 1.5

测试已测试
语言语言 SwiftSwift
许可 未知
发布上次发布2018年11月
SwiftSwift 版本4.0
SPM支持 SPM

travel 维护。



CarouselSwift

Language: Swift 3 Platform: iOS 8+ Cocoapods compatible License: MIT

### 屏幕截图 CarouselSwift

简介

CarouselSwift 实现轮播效果。功能特性

  • 轮播方式支持循环和线性
    • 循环:cell 循环,动作似无限。
    • 线性:cell 限制并且内存使用高度优化。
  • 支持水平和垂直布局方向
  • 视图中的多 cell。
  • 可修改 UIPanGestureRecognizer 的代理
  • 其他
    • 自动滚动:通过 NSTimer 实现,使用简单
    • 滚动 cell 进度:直接在代理中可用

CarouselSwift 优点 & 缺点

  • 优点

    • 易于使用:CarouselSwift 在其应用领域易于使用。

    • 通过系统提供的组件避免难以解决的问题

      • UIPanGestureRecognizer 代理修改
    • CarouselSwift 与系统提供的组件对比

    CarouselSwift UITableView UICollectionView UIPageViewController
    水平布局 ×
    垂直布局 ×
    单元格线性排列 ×
    单元格循环排列 × ×
    单元格大小需相同 × ×
    重用优化
    单元格可重用 ×(部分)
    一页多个单元格 ×
    pagingEnable × ×
    UIPanGestureRecognizer 代理修改 × × ×
    滚动进度 √(间接) √ (间接) ×

    根据上述比较,你可能发现 CarouselSwift 与 UIPageViewController 有很多相似之处,但使用起来更加简单。

    • CarouselSwift 与其他类似组件对比:
      • CarouselSwift 支持水平和垂直布局方向,而其他组件仅支持一个方向
      • CarouselSwift 支持单元格在线性和循环排列中,其他组件仅支持线性排列
      • CarouselSwift 的单元格重用能力可避免大量内存消耗
      • CarouselSwift 支持在一页中显示多个视图
  • 限制

    • 所有页面/单元格大小必须相同。如果大小不同,请使用 UITableView 或 UICollectionView。

工作原理(原理):

CarouselSwift 使用 UIScrollView 实现

  • 采用 UIScrollView 作为容器
  • 循环(无限):使用 N + 2 个单元格,在到达 0 和 N 时设置 contentOffset
  • 自动滚动:NSTimer
  • 自动滚动和手动滚动:UIScrollViewDelegate 的 scrollViewWillBeginDragging(:) 停止查找器,scrollViewDidEndDragging(:willDecelerate:) 启动查找器

使用方法

CarouselView

let carousel = CarouselView.init(frame: view.bounds)
view.addSubview(carousel)
carousel.type = .loop   // set cell loop or linear
carousel.dataSource = self  // set data source cell view
carousel.reload()   // load datas

carousel.autoScroll(2, increase: true)  // set auto scroll
carousel.delegate = self    // set scroll delegate

carousel.scrollTo(cell: 1) // scroll to specify cell
carousel.cellPerPage = 3 // number view show in one page


// CarouselViewDataSourse
func numberOfView(carousel:CarouselView) -> Int  // total count of view
func carousel(carousel:CarouselView, viewForIndex index:Int) -> UIView?

CarouselViewController

let carousel = CarouselViewController()
carousel.type = .loop   // set cell loop or linear
carousel.dataSource = self  // set data source cell view
carousel.reload()   // load datas

carousel.autoScroll(2, increase: true)  // set auto scroll
carousel.delegate = self    // set scroll delegate

carousel.scrollTo(cell: 1) // scroll to specify cell
carousel.cellPerPage = 3 // number view show in one page


// CarouselViewControllerDataSourse
func numberOfViewController(carousel:CarouselViewController) -> Int  // total count of view controller
func carousel(carousel:CarouselViewController, viewControllerForIndex index:Int) -> UIViewController?

CocoaPods

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!

pod 'CarouselSwift'

如果你使用 swift 2,请使用 pod 'CarouselSwift' ,'~> 0.1'

CarouselSwift 介绍

CarouselSwift 旋转木马效果是最常见的效果,实现了以下功能:

  • 支持轮播和线性滑动
    • 轮播(Loop):也就是我们通常说的无限循环功能
    • 线性滑动(Linear):采用 reusable cell的方式,使用极少的内存资源(需要时进行显示);类似 UITableView, UICollectionView, UIPageViewController
  • 支持多个方向
    • 水平:横向(Horizontal)
    • 垂直:纵向(Vertical)
  • 支持多个页面:视图内同时显示多个page
  • 可以修改 手势(UIPanGestureRecognizer)的delegate实现特殊的功能(比如边界,显示特殊的view或者push/pop view)
  • 其他
    • 自动轮播:默认封装了timer实现自动轮播,可以直接使用
    • 切换进度:在 delegate中自动计算切换page的进度

CarouselSwift 优势与限制

  • 优势

    • 简单易用:CarouselSwift在其使用场景下,使用更简单,开源具有很大的自主性。

    • 避免系统使用组建,难以解决的问题:

      • UIPanGestureRecognizer delegate 手势修改问题
      • UIPageViewController Crash问题
        • view controller 为空时候的,滑动crash问题相比不会陌生
        • setViewControllers(_:direction:animated:completion:)
    • CarouselSwift 与系统提供的组件简单比较

    CarouselSwift UITableView UICollectionView UIPageViewController
    水平布局 ×
    垂直布局 ×
    内容线性排列 ×
    内容循环排列 × ×
    cell 是否要求相同 × ×
    重用优化
    cell 是否可以重用 ×(部分)
    page 中 显示 多个 cell ×
    是否支持分页 × ×
    UIPanGestureRecognizer delegate 修改 × × ×
    滑动进度 √(间接) √(间接) ×

    通过上面的比较,可以发现 CarouselSwift 和 UIPageViewController 有很大的相似性(其实差不多就是模仿 UIPageViewController 来做的),使用起来更为简单

    • CarouselSwift 与其他类似功能组建比较:
      • CarouselSwift 同时支持水平和垂直,而其他通常支持一种
      • CarouselSwift 同时支持内容线性排列和循环排列,而其他通常支持一种
      • CarouselSwift cell采用重用的方式,避免将所有 view 都加载
      • CarouselSwift 单页内可以显示多个view,其它只支持一个
  • 限制与使用场景

    • CarouselSwift 只适合用于每个 cell 的大小完全相同的场景,无法像 UITableView和UICollectionView支持不同的大小的 cell,对于 cell 大小不一致的是否,推荐使用系统组件

原理:

CarouselSwift 是采用 UIScrollView 来实现的

  • 采用的是 UIScrollView 作为容器来实现的
  • 轮播(无限循环):使用 N + 2 个cell,在滑动到 0, N的时候通过调整contentOffset
  • 自动滚动:通过使用 NSTimer 定时来实现
  • 自动滚动与手势配合: UIScrollViewDelegate的 scrollViewWillBeginDragging(:) 关闭timer,scrollViewDidEndDragging(:willDecelerate:) 开启timer

使用

CarouselView

let carousel = CarouselView.init(frame: view.bounds)
view.addSubview(carousel)
carousel.type = .loop   // 设置内容 cell 是否循环
carousel.dataSource = self  // 设置数据源 cell view
carousel.reload()   // 加载数据

carousel.autoScroll(2, increase: true)  // 设置自动滚动
carousel.delegate = self    // 设置滚动 delegate, 获取滚动进度

carousel.scrollTo(cell: 1) // 滚动到指定 cell
carousel.cellPerPage = 3 // 单页可以显示 view 数量


// CarouselViewDataSourse
func numberOfView(carousel:CarouselView) -> Int  // 返回用于显示 view 的总数
func carousel(carousel:CarouselView, viewForIndex index:Int) -> UIView? // index 对应的 view, nil则表示该 index 不显示

CarouselViewController

let carousel = CarouselViewController()
carousel.carouselView.type = .loop   // 设置内容 cell 是否循环
carousel.dataSource = self  // 设置数据源 cell view
carousel.reload()   // 加载数据

carousel.autoScroll(2, increase: true)  // 设置自动滚动
carousel.delegate = self    // 设置滚动 delegate, 获取滚动进度

carousel.scrollTo(cell: 1) // 滚动到指定 cell
carousel.cellPerPage = 3 // 单页可以显示 view 数量


// CarouselViewControllerDataSourse
func numberOfViewController(carousel:CarouselViewController) -> Int  // total count of view controller
func carousel(carousel:CarouselViewController, viewControllerForIndex index:Int) -> UIViewController? // index 对应的 view controller, nil则表示该 index 不显示