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 不显示