TL;DR 正确处理UIPageViewController。
⭐️ 功能
- 简化数据源管理并增强代理。
- 动态插入和删除页面。
- 无限滚动支持。
- 基于定时器的自动页面过渡。
- 支持自定义动画页面过渡。
📋 要求
Pageboy需要iOS 11/tvOS 11,且与Swift 5兼容。
📲 安装
Swift Package Manager
Pageboy与Swift Package Manager兼容,并且可以通过Xcode集成。
CocoaPods
Pageboy也可通过CocoaPods获得。
pod 'Pageboy', '~> 4.0'
Carthage
Pageboy也可通过Carthage获得。
github "uias/Pageboy" ~> 4.0
🚀 使用方法
基础知识
- 创建一个
PageboyViewController
实例并提供它一个PageboyViewControllerDataSource
。
class PageViewController: PageboyViewController, PageboyViewControllerDataSource {
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
}
}
- 实现
PageboyViewControllerDataSource
函数。
func numberOfViewControllers(in pageboyViewController: PageboyViewController) -> Int {
return viewControllers.count
}
func viewController(for pageboyViewController: PageboyViewController,
at index: PageboyViewController.PageIndex) -> UIViewController? {
return viewControllers[index]
}
func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? {
return nil
}
PageboyViewControllerDelegate
由 PageboyViewController
提供的代表函数比原始的 UIPageViewController
提供的更可靠、更有用。您可以使用它们来确切地找到当前页面的位置,并且当它移动时,知道它将去往何方。
即将开始过渡到新页面的过程。
过渡到新页面。
func pageboyViewController(_ pageboyViewController: PageboyViewController,
willScrollToPageAt index: Int,
direction: PageboyViewController.NavigationDirection,
animated: Bool)
滚动到过渡到新页面过程中的相对位置。
成功完成过渡到页面的滚动。
func pageboyViewController(_ pageboyViewController: PageboyViewController,
didScrollTo position: CGPoint,
direction: PageboyViewController.NavigationDirection,
animated: Bool)
成功完成到页面的滚动过渡。
成功的滚动过渡到了新页面。
func pageboyViewController(_ pageboyViewController: PageboyViewController,
didScrollToPageAt index: Int,
direction: PageboyViewController.NavigationDirection,
animated: Bool)
DidReload
子视图控制器已重新加载。
func pageboyViewController(_ pageboyViewController: PageboyViewController,
didReloadWith currentViewController: UIViewController,
currentPageIndex: PageIndex)
导航
您可以使用 scrollToPage()
方法以编程方式在 PageboyViewController
中导航。
pageViewController.scrollToPage(.next, animated: true)
- 使用
.isInfiniteScrollEnabled
可以启用无限滚动。 - 交互式滚动也可以通过
.isScrollEnabled
控制。
插入与删除
Pageboy 允许在 PageboyViewController
中动态插入和删除页面。
func insertPage(at index: PageIndex, then updateBehavior: PageUpdateBehavior)
func deletePage(at index: PageIndex, then updateBehavior: PageUpdateBehavior)
这与在 UITableView
中插入行类似,您需要在调用任何更新函数之前更新数据源。
示例
let index = 2
viewControllers.insert(UIViewController(), at: index)
pageViewController.insertPage(at: index)
在插入或删除页面后,默认行为是滚动到更新位置,但这可以通过传递一个除 .scrollToUpdate
之外的其他 PageUpdateBehavior
值来配置。
⚡️ 其他附加功能
reloadData()
- 重新加载页面视图控制器中的视图控制器(重新加载数据源)。.navigationOrientation
- 是否水平或垂直定位页面。.currentViewController
- 如果存在,当前显示的视图控制器。.currentPosition
- 页面视图控制器的确切相对位置。.currentIndex
- 当前可见页面的索引。.parentPageboy
- 从任何子视图控制器访问直接父PageboyViewController
。
动画转换
Pageboy 还提供了对 动画转换 的自定义支持。这可以通过 PageboyViewController
上的 .transition
属性进行自定义。
pageboyViewController.transition = Transition(style: .push, duration: 1.0)
注意:默认设置为此属性为 nil
,这将使用 UIPageViewController
提供的标准动画。
自动滚动
PageboyAutoScroller
可用于设置基于计时器的自动滚动 PageboyViewController
。
pageboyViewController.autoScroller.enable()
还支持自定义间歇时间和其他滚动行为。
👨💻 关于
- 由 Merrick Sapsford (@MerrickSapsford) 创建
- 由一个不断增长的 贡献者列表 贡献。
❤️ 贡献
欢迎在 GitHub 上提交错误报告和拉取请求:https://github.com/uias/Pageboy。
👮♂️ 许可证
本库在 MIT 许可证 的条款下作为开源提供。