⚠️ Swift 3.2 的最新版本是 3.2.0 ⚠️ (不再维护)
⚠️ Swift 4.0 的最新版本是 4.1.3 ⚠️
⚠️ Swift 4.2 的最新版本是 4.2.2 ⚠️
⚠️ Swift 5 的最新版本是 5.1.0 ⚠️
4.1.0 迁移到 4.2.0
语法重命名:从 NSAttributedStringKey
到 NSAttributedString.Key
3.2.0 迁移到 4.1.0
修正拼写错误:将 interporation
修改为 interpolation
,如果访问到此变量,请更改命名
关于
BmoViewPager 是一个基于 UIPageViewController 和 UICollectionView 的 viewPager 组件,它是一个供和管理每个 viewController 的便捷方式。
我想让 UIPageViewController 更直观易用,就像 UITableView 一样,并快速简单地提供导航栏。
更重要的是,当 UIPageViewController 持续滚动时,页面控制器有时会得到错误的索引,这个 viewPager 可以帮助您解决这个问题。
实现了一些标准的 dataSource 和 delegate,用于生成每个页面和导航栏,每个类都包含在 BmoViewPager 的 Pod 示例中,并有简单的示例代码。
简单用法
创建一个UIView扩展BmoViewPager
实现BmoViewPagerDataSource
提供页码数和每个页面控制器,就像使用tableView
func bmoViewPagerDataSourceNumberOfPage(in viewPager: BmoViewPager) -> Int {
return YourPageCount
}
func bmoViewPagerDataSource(_ viewPager: BmoViewPager, viewControllerForPageAt page: Int) -> UIViewController {
return YourPageViewController
}
与一个NavigationBar一起使用
创建一个UIView扩展BmoViewPagerNavigationBar
将一个BmoViewPager分配给BmoViewPagerNavigationBar
使用默认样式,只需要提供每个页面的标题
func bmoViewPagerDataSourceNaviagtionBarItemTitle(_ viewPager: BmoViewPager, navigationBar: BmoViewPagerNavigationBar, forPageListAt page: Int) -> String? {
return YourPageTitleString
}
导航栏项目标题可以自定义属性
func bmoViewPagerDataSourceNaviagtionBarItemNormalAttributed(_ viewPager: BmoViewPager, navigationBar: BmoViewPagerNavigationBar, forPageListAt page: Int) -> [NSAttributedString.Key : Any]? {
return [
NSAttributedString.Key.foregroundColor : UIColor.lightGray,
NSAttributedString.Key.font : UIFont.systemFont(ofSize: 14.0)
]
}
func bmoViewPagerDataSourceNaviagtionBarItemHighlightedAttributed(_ viewPager: BmoViewPager, navigationBar: BmoViewPagerNavigationBar, forPageListAt page: Int) -> [NSAttributedString.Key : Any]? {
return [
NSAttributedString.Key.foregroundColor : UIColor.red,
NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 14.0)
]
}
如果您不想使用默认样式,您可以自定义自己的背景视图和高亮背景视图
![]() |
![]() |
高级使用
支持从右到左(RTL)用户界面
支持垂直和水平方向滚动
BmoNavigationBar 自动聚焦(默认为 true)
BmoNavigationBar 标题可以设置普通和突出显示的属性样式
BmoViewPager 无限滚动(默认为 false)
BmoViewPager 的 presentedPageIndex 可以程序设置当前页面
自定义 NavigationBar 动画,你可以从 BmoViewPagerDelegate 获取滚动进度
当通过点击导航项切换 ViewPager 页面时实施导航栏插值动画
无限滚动 | 自定义 NavigationBar 动画 |
---|---|
![]() |
![]() |
PageControl 优化
原生 pageController 在实现了 func presentationCount(for pageViewController: UIPageViewController) -> Int
和 func presentationIndex(for pageViewController: UIPageViewController) -> Int
后有默认的页面控制,但有时索引会有点小问题,如果你感觉到了,希望这能帮到你
Native PageController 连续滚动 | 使用 bmoViewPager 实现连续滚动 |
---|---|
![]() |
![]() |
常见问题
如何动画BmoViewPager页面的改变?
BmoViewPager
和 BmoViewPagerNavigationBar
中都有一个名为 isInterpolationAnimated
的属性,默认值都为 true。最重要的是,如果你希望每次都能有滚动动画,需要在 BmoViewPagerDataSource
请求之前初始化 pageViewController,并通过 public func setReferencePageViewController(_ vc: UIViewController, at page: Int)
告诉 BmoViewPager
陕西省委。
例如,我总是将上一页、当前页和下一页的 UIViewController
存放在一个名为 cachedPageViewControllers
的字典中。
var cachedPageViewControllers = [Int: UIViewController]()
func bmoViewPagerDelegate(_ viewPager: BmoViewPager, didAppear viewController: UIViewController, page: Int) {
switch page {
case 0:
self.prepareCachedPageViewControllers(pages: [pageCount - 1, page, page + 1])
case 1..<(pageCount - 1):
self.prepareCachedPageViewControllers(pages: [page - 1, page, page + 1])
case pageCount - 1:
self.prepareCachedPageViewControllers(pages: [page - 1, page, 0])
default:
break
}
}
func bmoViewPagerDataSource(_ viewPager: BmoViewPager, viewControllerForPageAt page: Int) -> UIViewController {
if let cacheVC = cachedPageViewControllers[page] {
return cacheVC
} else {
let vc = createPageViewController(page)
viewPager.setReferencePageViewController(vc, at: page)
cachedPageViewControllers[page] = vc
return vc
}
}
private func prepareCachedPageViewControllers(pages: [Int]) {
cachedPageViewControllers.forEach({ (key, vc) in
if !pages.contains(key) {
cachedPageViewControllers[key] = nil
}
})
pages.forEach { (page) in
if cachedPageViewController[page] == nil {
let vc = createPageViewController(page)
viewPager.setReferencePageViewController(vc, at: page)
cachedPageViewControllers[page] = vc
}
}
}
private func createPageViewController(_ page: Int) -> UIViewController {
//TODO: return your own UIViewController
}
UIViewController
确保为每一页返回不同的 因为 BmoViewPager
是基于 UIPageViewController
的,当滚动视图滚动到边缘时,它会请求 UIPageViewControllerDataSource
获取下一页和上一页。同时,BmoViewPager
会将视图控制器和页码保存到视图控制器视图的属性中,这将导致这个页面的视图控制器具有错误属性。
示例
要运行示例项目,首先从 Git 仓库克隆,然后从示例目录中运行 pod install
。
要求
- iOS 9.0+
- Swift 5.0+
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它:
$ gem install cocoapods
BmoViewPager 4.0.0+ 需要 CocoaPods 1.1.0+ 版本来构建。
要使用 CocoaPods 将 BmoViewPager 集成到您的 Xcode 项目中,请在您的 Podfile
中指定它:
use_frameworks!
target '<Your Target Name>' do
pod 'BmoViewPager', '~> 4.0.0'
end
然后,运行以下命令:
$ pod install
手动
如果您不希望使用依赖管理器,您可以手动将 BmoViewPager 集成到您的项目中,只需将 BmoViewPager 文件夹复制到您的项目中即可。
作者
许可
BmoViewPager 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。