测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最新发布 | 2015 年 9 月 |
SPM支持 SPM | ✗ |
由 Ievgen Rudenko 维护。
MAGPagedScrollView 是一些滚动类的集合,它将视图和视图控制器组织成水平滚动流
请将您应用的链接发送给我们,我们将创建应用画廊。
以下是一个视频演示
以及真实的引导屏幕示例
将此行添加到 Podfile
pod 'MAGPagedScrollView'
UIScrollVeiw 的子类,它将以滚动卡片的形式组织其子视图。它也是其他人的基类:PagedReusableScrollView 和 PagedParallaxScrollView。
结果看起来是这样的
要实现它,只需使用此函数
func addSubviews(aSubviews: [ViewProvider])
并添加几行代码,以下是如何实现的示例代码
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
scrollView.addSubviews([
createView(0),
createView(1),
createView(2),
createView(3)
])
}
func createView(color: Int) -> UIView {
var view = UIView(frame: CGRectMake(0, 0, 100, 100))
view.backgroundColor = UIColor.randomColor
view.layer.cornerRadius = 10.0
return view
}
所以 PagedScrollView 与 ViewProvider 操作
@objc protocol ViewProvider {
var view: UIView! { get }
}
因此,ViewProvider 是可以提供视图的类。 UIViewController 已经可以使用,提供了它自己的视图。 UIView 本身也是一个 ViewProvider,提供自身。
请注意,PagedScrollView 不保留 ViewProvider 的引用,所以您必须自己处理这些对象的所属权。但是,由 ViewProvider 提供的视图将作为子视图添加,因此它们将被 PagedScrollView 引用
您可以使用 5 个内置转换类来实现视图滑动
scrollView.transition = .None
scrollView.transition = .Slide
scrollView.transition = .Dive
scrollView.transition = .Roll
scrollView.transition = .Cards
这个类使用了UITableViewController,并复用了ViewProvider。因此,你需要实现PagedReusableScrollViewDataSource协议。这个类拥有ViewProvider对象,并提供两个用于复用的函数。
func dequeueReusableView(#tag:Int) -> ViewProvider?
func dequeueReusableView(#viewClass:AnyClass) -> ViewProvider?
所以,ViewProvider可以通过标签或类进行复用。
PagedReusableScrollViewDataSource协议需要以下函数:
func scrollView(scrollView: PagedReusableScrollView, viewIndex index: Int) -> ViewProvider
func numberOfViews(forScrollView scrollView: PagedReusableScrollView) -> Int
因此,汇总起来,示例实现可能如下:
extension ViewController3: PagedReusableScrollViewDataSource {
func scrollView(scrollView: PagedReusableScrollView, viewIndex index: Int) -> ViewProvider {
var newView:SimpleCardViewController? = scrollView.dequeueReusableView(tag: 1 ) as? SimpleCardViewController
if newView == nil {
newView = SimpleCardViewController()
}
newView?.imageName = "photo\(index%5).jpg"
return newView!
}
func numberOfViews(forScrollView scrollView: PagedReusableScrollView) -> Int {
return 10
}
}
结果将如下:
这个视图将根据当前的重力感应进度填充其子视图,从-100到100,其中0是中心位置。因此,你可以根据位置调整约束、位置、颜色等。
因此,ViewProvider的视图应满足协议。
@objc protocol PagedScrollViewParallaxView: class {
func parallaxProgressChanged(progress:Int)
}
如果你想要使用ViewController作为ViewProvider,可以将这个视图作为
因此,ViewController的实现可能如下:
extension ParralaxCardViewController: PagedScrollViewParallaxView {
func parallaxProgressChanged(progress:Int) {
self.imageView.bounds = CGRectMake(CGFloat(progress), 0, imageView.bounds.size.width, imageView.bounds.size.height)
detailsCentralConstraint.constant = CGFloat(-progress*4)
imageCentralConstraint.constant = CGFloat(-progress)
titleTopConstraint.constant = CGFloat(abs(progress))
}
}
结果如下:
因此,任何人都可以成为ViewProvider,但如果你在使用
并期望收到子视图控制器的旋转回调,例如在iOS8+中进行处理。
func viewWillTransitionToSize(_ size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
为实现此功能,根据Apple文档,我们需要在容器视图控制器中实现一些逻辑(示例来自Apple文档)。
- (void) displayContentController: (UIViewController*) content;
{
[self addChildViewController:content]; // 1
content.view.frame = [self frameForContentController]; // 2
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self]; // 3
}
问题是,PagesScrollView不是一个视图控制器,也不能作为容器。此外,视图没有对其视图控制器的引用,所以你需要自己实现。幸运的是,你所需要的只是从 PagedScrollViewContainerViewController 继承拥有PagedScrollView的ViewController。
class ViewController4: PagedScrollViewContainerViewController {
...
它将实现可选功能以处理此事。因此,所有的子视图控制器都将按预期表现,收到所有生命周期消息(如
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
println("\(self) viewWillTransitionToSize: \(size) with coordinator: \(coordinator)")
}
你可以将 customTransition 属性分配给任何转换。转换由 PagedScrollViewTransitionProperties 结构描述。
struct PagedScrollViewTransitionProperties {
var angleRatio: CGFloat = 0.0
var translation: CGVector = CGVector(dx:0.0, dy:0.0)
var rotation: Rotation3D = Rotation3D()
}
struct Rotation3D {
var x:CGFloat = 0.0
var y:CGFloat = 0.0
var z:CGFloat = 0.0
}
所有内置的转换也都是 PagedScrollViewTransitionProperties。因此,要创建和应用自定义属性,请使用以下代码:
scrollView.customGTransition = PagedScrollViewTransitionProperties(angleRatio: 0.5, translation: CGVector(dx:0.25,dy:0.0), rotation: Rotation3D(x:-1.0,y:0.0,z:0.0))
scrollView.transition = .Custom
如果你在使用此代码,请 somewhere 适当的提及。比如在网站上、关于页面、应用程序本身,或者通过电子邮件或GitHub告知我。了解代码的使用地点总是令人愉快的。
MadAppGang.com实现,我们做优秀的iOS应用程序。
MAGPagedScrollView发布在MIT许可证下
版权所有©2015,Ievgen Rudenko,MadAppGang
特此许可,免费向任何获得此软件及相关文档文件(“软件”)副本的人提供,允许其在软件上不受限制地处理,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件复制件,以及允许软件提供方这样做,但受以下条款约束:
上述版权声明和本许可声明应包含在软件的所有副本或主要部分的副本中。
软件按“现状”提供,不提供任何形式的明示或默示保证,包括但不限于适销性、特定用途的适用性和非侵权性。在任何情况下,作者或版权持有人不对任何索赔、损害或其他责任承担责任,无论是因为合同、侵权或其他原因,由于、源于或与软件或其使用或其他处置有关。