MAGPagedScrollView 0.1.1

MAGPagedScrollView 0.1.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2015 年 9 月
SPM支持 SPM

Ievgen Rudenko 维护。



  • Ievgen Rudenko

MAGPagedScrollView

MAGPagedScrollView 是一些滚动类的集合,它将视图和视图控制器组织成水平滚动流

  • 100% Swift (是否仍在使用 Objective-C 进行开发?)
  • 重用表视图的行为(内存效率高)
  • 易于使用(2 分钟即可实现基本应用程序)
  • 支持和错误修复(我们正在我们的产品中使用此组件)

请将您应用的链接发送给我们,我们将创建应用画廊。

以下是一个视频演示

youtube

以及真实的引导屏幕示例

youtube

youtube

安装

将此行添加到 Podfile

    pod 'MAGPagedScrollView'

PagedScrollView

UIScrollVeiw 的子类,它将以滚动卡片的形式组织其子视图。它也是其他人的基类:PagedReusableScrollViewPagedParallaxScrollView

结果看起来是这样的

ScreenShot

要实现它,只需使用此函数

    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
    }

所以 PagedScrollViewViewProvider 操作

@objc protocol ViewProvider {
    var view: UIView! { get }
}

因此,ViewProvider 是可以提供视图的类。 UIViewController 已经可以使用,提供了它自己的视图。 UIView 本身也是一个 ViewProvider,提供自身。

请注意,PagedScrollView 不保留 ViewProvider 的引用,所以您必须自己处理这些对象的所属权。但是,由 ViewProvider 提供的视图将作为子视图添加,因此它们将被 PagedScrollView 引用

转换

您可以使用 5 个内置转换类来实现视图滑动

ScreenShot

scrollView.transition = .None

滑动

ScreenShot

scrollView.transition = .Slide

潜行

ScreenShot

scrollView.transition = .Dive

卷曲

ScreenShot

scrollView.transition = .Roll

纸牌

ScreenShot

scrollView.transition = .Cards

PagedReusableScrollView

这个类使用了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
    }

}

结果将如下:

ScreenShot

PagedParallaxScrollView

这个视图将根据当前的重力感应进度填充其子视图,从-100到100,其中0是中心位置。因此,你可以根据位置调整约束、位置、颜色等。

因此,ViewProvider的视图应满足协议。

@objc protocol PagedScrollViewParallaxView: class {
    func parallaxProgressChanged(progress:Int)
}

如果你想要使用ViewController作为ViewProvider,可以将这个视图作为ParallaxViewProxy的子类。这样,ParallaxViewProxy将所有的重力感应进度重定向到其重力感应控制器。

因此,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))
    }

}

结果如下:

ScreenShot

将ViewController用作ViewProvider

因此,任何人都可以成为ViewProvider,但如果你在使用UIViewController子类作为ViewProvider时,你期望所有视图控制器生命周期都按预期和Apple文档中描述的方式工作。

lyfecycle

并期望收到子视图控制器的旋转回调,例如在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 {
...

它将实现可选功能以处理此事。因此,所有的子视图控制器都将按预期表现,收到所有生命周期消息(如viewWillAppear和 viewWillDisappear)和旋转消息。你可以在 ParralaxCardViewController 的源代码中查看它。

    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

特此许可,免费向任何获得此软件及相关文档文件(“软件”)副本的人提供,允许其在软件上不受限制地处理,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件复制件,以及允许软件提供方这样做,但受以下条款约束:

上述版权声明和本许可声明应包含在软件的所有副本或主要部分的副本中。

软件按“现状”提供,不提供任何形式的明示或默示保证,包括但不限于适销性、特定用途的适用性和非侵权性。在任何情况下,作者或版权持有人不对任何索赔、损害或其他责任承担责任,无论是因为合同、侵权或其他原因,由于、源于或与软件或其使用或其他处置有关。

Bitdeli Badge