TL;DR 正确使用 UIPageViewController。
Pageboy 需要 iOS 12 / tvOS 12;并兼容 Swift 5。
Pageboy 兼容 Swift Package Manager,可以通过 Xcode 集成。
Pageboy 也可通过 CocoaPods 获取
pod 'Pageboy', '~> 4.2'
Pageboy 也可通过 Carthage 获取
github "uias/Pageboy" ~> 4.2
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
}
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)
子视图控制器已重新加载。
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()
还支持自定义间隔持续时间和其他滚动行为。
欢迎在 GitHub 上提交错误报告和拉取请求:https://github.com/uias/Pageboy。
该库以 MIT 许可证 的条款开源发布。