测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可协议 | MIT |
发布最后发布 | 2017年7月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由Ayden P维护。
这是一个基于代理的快速分页滚动视图类,可以为您处理所有布局。
在 iOS 上创建分页滚动视图并非总是最容易的事。有了 APPagedScrollView 和类似 UITableViewDelegate 和 UITableViewDataSource 的 API,您几乎无需编写任何代码就能开始使用。
此外,还有一个 APPagedScrollViewController
,它可以设置滚动视图,实现了代理和数据源方法,因此您可以轻松地重写这些方法并提供您想要的数据。
您可以使用 CocoaPods 在 Podfile 中添加 APPagedScrollView 来安装。
pod 'APPagedScrollView'
或者复制两个 Swift 文件(如有需要)。
现在为每个类都提供了文档! 点击此处查看文档
根据您的需求,您可以选择继承并重写 APPagedScrollViewController
上的方法,或者只是使用您自己的类并实现 APPagedScrollViewDelegate
和 APPagedScrollViewDataSource
。
在我们的示例中,我们继承自 APPagedScrollViewController
。
class MyPagingScrollViewController: APPagedScrollViewController {
var pages = ["Hello", "world!"]
// MARK: - Paged Scroll View Data Source
override func numberOfPages(in pagedScrollView: APPagedScrollView) -> Int {
return pages.count
}
override func view(forPageAt index: Int, in pagedScrollView: APPagedScrollView) -> UIView {
let view = UIView()
let label = UILabel()
label.text = pages[index]
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
return view
}
// MARK: - Paged Scroll View Delegate
override func pagedScrollView(_ pagedScrollView: APPagedScrollView, movedTo index: Int, from oldIndex: Int?) {
super.pagedScrollView(pagedScrollView, movedTo: index, from: oldIndex)
print("Scroll view moved to page \(index)!")
}
}
视图控制器还提供了内置的页面控制功能,这意味着它可以自动更新您的 UIPageControl
的当前索引和总页面数,并允许用户通过点击它进行导航。为了获得此功能,只需创建一个 UIPageControl
并将其设置在视图控制器上。
// Create a page control
let pageControl = UIPageControl()
pageControl.translatesAutoresizingMaskIntoConstraints = false
// Add and set its location
view.addSubview(pageControl)
pageControl.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
pageControl.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -20).isActive = true
// Set on the view controller so we can receive updates
self.pageControl = pageControl
默认情况下,滚动视图会附着到视图控制器的视图顶部。这通常是没问题的,除非你手动设置了滚动视图的内容内边距,并且不想担心将其适当地设置到布局中。你可以重写 attachScrollViewToTopLayoutGuide
并返回 true
以直接将滚动视图附着到顶部布局向导,从而无需自动设置滚动视图的内边距。但请注意,iOS 11 默认会在应用系统内边距之后再更改此行为。
视图控制器默认有一些变量和函数,它们继承了分页滚动视图类的一些功能。
通过使用视图,你将无法获得自动布局或页面控制功能。你需要自己进行设置。一旦设置好,请务必正确设置 pagingDelegate
和 dataSource
属性,以确保其知道从哪里接收数据。
如果 iOS 设备的尺寸发生变化(旋转等),滚动视图可能会错位。你可以调用它的 alignScrollView()
方法来重新对齐。这会导致滚动视图跳到对齐位置,因此你也可以提供一个 UIViewControllerTransitionCoordinator
来与之一起动画。以下是一个例子,它会在旋转过程中自动对齐滚动视图位置:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
scrollView.alignScrollView(with: coordinator)
}
要在视图中重新加载数据,只需在滚动视图或其控制器上调用 reloadData()
即可。
如果你需要在代码的其他地方获取当前页索引或页数,你可以在滚动视图或其控制器上调用 currentPageIndex
或 numberOfPages
。
我们在滚动视图及其控制器上提供了便利变量,分别命名为 canGoBack
和 canGoForward
,这些变量会告诉你根据当前索引和页数,滚动视图是否可以向前或向后滚动。你可以在代码中使用这些来禁用页面更改时的上一页/下一页按钮,例如。
你可以通过滚动视图或其控制器上的 goBack
或 goForward
函数简单地后退或前进(它们两者也接受一个可选的布尔参数,animated
)。
你还可以直接将上一部分中的 currentPageIndex
设置为滚动到相应页面的动画。如果你不想要动画,请使用 scroll(to: index, animated: animated)
函数并将动画关闭,即使用 animated
参数。
UIScrollViewDelegate
方法。APPagedScrollView需要访问滚动视图的代理来正确接收事件,但它在上面有一个名为receivingDelegate
的属性,我们将所有事件都转发给它,这样您就可以接收它们。
两个代理方法允许您在用户更改页面或正在页面间转换时执行操作。
func pagedScrollView(_ pagedScrollView: APPagedScrollView, movedTo index: Int, from oldIndex: Int?)
在页面切换到index
后调用。oldIndex
包含它切换到的页面,如果有的话。
func pagedScrollView(_ pagedScrollView: APPagedScrollView, movingTo index: Int, from oldIndex: Int, progress: CGFloat)
在从一页滚到另一页期间调用。index
是我们认为它将结束的页面,oldIndex
是它正在转换从的页面,而progress
是从0到1的值,包含转换的进度。您可以使用此功能在页面变化时执行交互式滚动事件和动画。
请注意,默认情况下,
pagedScrollView(_:, movingTo:, index:, progress:)
不会收集滚动视图内容区域之外的事件。为了解释更多,所有使用iOS的人都知道滚动视图允许您滚动到内容区域之外,具有弹性的效果来减慢您的速度,使您在完成时回到原来的位置。如果您希望代理方法也收集这些事件,您可以启用elasticScrollingEvents
,但是请确保您在代理中依赖页面号码的逻辑知道考虑这些转换(超出边界的页面将具有-1的索引或正好在可能的范围之外)。
此项目根据MIT许可证
授权。请在使用库时确保符合其条款。