swift+UIPageViewController 纯代码实现引导页

原创 2016年08月29日 18:35:02

使用UIPageViewController

1、介绍:

UIPageViewController是一个类似UINavigationController的Controller容器。它既可以实现UIScrollView的滑动效果,也可以实现UIPageController的翻页效果。其中每个具体的视图由各自的ViewController进行维护管理,UIPageViewController只进行协调与动画布置。
UIPageViewControllerDataSource协议为UIPageViewController提供数据,UIPageViewControllerDelegate对翻页动作、屏幕旋转进行监听。

2、代码:
/// 引导页
class YSGuidePageViewController: UIPageViewController,UIPageViewControllerDelegate,UIPageViewControllerDataSource {

    /// 页面数量改变时的回调
    var pageViewControllerUpdatePageCount:((YSGuidePageViewController,NSInteger)->Void)!
    /// 页面改变时的回调
    var pageViewControllerUpdatePageIndex:((YSGuidePageViewController,NSInteger)->Void)!

    private(set) lazy var allViewControllers:[UIViewController]={
        return [YSGuideImgViewController(imgName: "guide_pic_new1",frame: self.view.bounds, showBtn:false),
                YSGuideImgViewController(imgName: "guide_pic_new2",frame: self.view.bounds, showBtn:false),
                YSGuideImgViewController(imgName: "guide_pic_new3",frame: self.view.bounds,showBtn:true)]
    }()

    internal init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation: UIPageViewControllerNavigationOrientation, options: [String : AnyObject]?, pageCount:((YSGuidePageViewController,NSInteger)->Void)!, pageIndex:((YSGuidePageViewController,NSInteger)->Void)!) {
        super.init(transitionStyle: style, navigationOrientation: navigationOrientation, options: options)
        self.pageViewControllerUpdatePageCount = pageCount
        self.pageViewControllerUpdatePageIndex = pageIndex
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
        dataSource = self
        //设置首页
        if let firstViewController = allViewControllers.first {
            setViewControllers([firstViewController], direction: .Forward, animated: true, completion:nil)
        }

        //页面数量改变时
        if self.pageViewControllerUpdatePageCount != nil {
            self.pageViewControllerUpdatePageCount(self,allViewControllers.count)
        }
    }

    //mark:获取前一个页面
    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        //guard 条件为false就执行else里的函数块
        guard let viewControllerIndex = allViewControllers.indexOf(viewController) else {
            return nil
        }
        let previousIndex = viewControllerIndex - 1
        guard previousIndex >= 0 else {
            return nil
        }
        guard allViewControllers.count > previousIndex else {
            return nil
        }
        return allViewControllers[previousIndex]
    }

    //mark:获取后一个页面
    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        guard let viewControllerIndex = allViewControllers.indexOf(viewController) else {
            return nil
        }
        let nextIndex = viewControllerIndex + 1
        let orderedViewControllersCount = allViewControllers.count
        guard orderedViewControllersCount != nextIndex else {
            return nil
        }
        guard orderedViewControllersCount>nextIndex else {
            return nil
        }
        return allViewControllers[nextIndex]
    }

    //mark:页面切换完毕
    func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        if let firstViewController = viewControllers?.first,let index = allViewControllers.indexOf(firstViewController) {
            if self.pageViewControllerUpdatePageIndex != nil {
                self.pageViewControllerUpdatePageIndex(self,index)
            }
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}





/// 具体承载引导图片的VC
class YSGuideImgViewController: UIViewController {

    private(set) lazy var imgview:UIImageView = {
        return UIImageView.init(frame:self.view.bounds)
    }()

    private(set) lazy var beginBtn:UIButton = {
        return UIButton(type:.Custom)
    }()
    /**
     重写了初始化方法

     - parameter imgName: 使用到的图片名称
     - parameter frame:   图片的frame
     - parameter showBtn: 是否展示开始体验的按钮

     - returns:
     */
    init(imgName:String, frame:CGRect, showBtn:Bool){
        super.init(nibName: nil, bundle: nil)
        self.view.frame = frame
        self.view.addSubview(self.imgview)
        self.imgview.image = UIImage(named: imgName)

        self.beginBtn.frame = CGRectMake((self.view.bounds.width-174)/2, self.view.bounds.height-40-42, 174, 42)
        self.beginBtn.setImage(UIImage(named:"home_btn_startup"), forState: .Normal)
        self.beginBtn.addTarget(self, action:#selector(beginBtnClicked), forControlEvents: .TouchUpInside)
        self.view.addSubview(self.beginBtn)
        self.beginBtn.hidden = !showBtn
    }

    /**
     按钮点击事件
     */
    func beginBtnClicked() {
        NSNotificationCenter.defaultCenter().postNotificationName("beginExperience", object: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}





/// 加载PageViewController的VC
class YSGuideViewController: YSBaseController {

    private(set) lazy var pageControl:UIPageControl = {
        return UIPageControl(frame:CGRectMake((self.view.bounds.width-200)/2,self.view.bounds.height-20-10,200,20))
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(removeGuidePageView), name: "beginExperience", object: nil)

        self.view.backgroundColor = UIColor(patternImage:UIImage(named: "launch_bg")!)
        self.view.addSubview(pageControl)
        pageControl.backgroundColor = UIColor.clearColor()
        pageControl.pageIndicatorTintColor = UIColor.whiteColor()
        pageControl.currentPageIndicatorTintColor = UIColor.redColor()
        loadGuidePageView()
    }

    func loadGuidePageView() {

        let guideview = YSGuidePageViewController.init(transitionStyle: .PageCurl, navigationOrientation: .Horizontal, options: nil, pageCount: { (guide:YSGuidePageViewController, count:NSInteger) in
            self.pageControl.numberOfPages = count
            },pageIndex: {(guide:YSGuidePageViewController, index:NSInteger) in
                self.pageControl.currentPage = index
        })//Scroll
        guideview.view.frame = self.view.bounds
        self.view.addSubview(guideview.view)
        self.addChildViewController(guideview)

        self.view.bringSubviewToFront(pageControl)
    }


    /**
     移除引导页,同时记录引导页已经显示完成
     */
    func removeGuidePageView() {

        self.view.removeFromSuperview()
        self.removeFromParentViewController()
        //Todo:存储第一次已经显示引导页

    }

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
3、实现提醒:

1、首先使用的过程中出现的一个最大最无语的问题就是UIPageViewController的代理不执行,而且只有一个引导页。
出现这个问题的原因是在YSGuideViewController中使用的时候忘记写 self.addChildViewController(guideview) ,所以这个狠重要。

UIPageViewController的使用(Swift)

class ViewController: UIViewController,UIPageViewControllerDataSource,UIPageViewControllerDelegate {...
  • lcl130
  • lcl130
  • 2014年12月24日 09:29
  • 3559

swift UI专项训练43 Swift实现APP引导页

第一次加载APP的时候通常会采用引导页来展示特色或者告知用户如何使用。打开我们的Storyboard,然后导入一个Page View Controller,作如下设置,修改Transition Sty...

Swift实现UIScrollView展示多个UIViewController

效果图: ----------FirstPageViewController----------- override func viewDidLoad() { ...

50天iOS挑战(Swift) - 第10天:制作应用启动引导页面

很多应用在用户初次启动时,会展示一个What's new页面,如果打造一个多屏幕适配的启动界面,同时又保证低耦合性呢?Let's do it! 本节将介绍启动界面的制作,下一节介绍登录界面的多屏幕适配...

iOS引导页,可选是视频或者是图片swift版

一个app引导页的封装,可以选择用图片滚动或者是播放视频 使用: 项目源码:GitHub项目地址...

关于iOS swift3.0 UICollectionView封装引导页和轮播图

关于iOS swift3.0 UICollectionView封装引导页和轮播图第一次写博客,文章若有不足之处,欢迎点出。最新在写一个新的项目,用到了引导页,所以用UICollectionView封装...

IOS9.0-Swift 引导页面实现

IOS9.0-Swift 引导页面实现学习不就ios开发,也想写点东西,第一次写这东西,不妥之处还请大家指正,我会及时修改。 平台:xcode7.1 x 语言:swift2.1 实现目标:完成一个ap...

ios UIPageViewController+pageControl实现引导页

1,首先准备一个控制器,在它里面添加一个UIPageViewController,然后添加要引导的控制器 头文件: #import @interface PVCPagesViewControll...
  • PZ0605
  • PZ0605
  • 2015年07月10日 13:52
  • 2424

iOS UIPageViewController - 使用总结

最近在一个项目中需要一种以翻书的形式来展示图片的功能,在查阅了一些资料后,初步了解了UIPageViewController,查到的资料都是比较久之前的,有的还是在MRC的,在使用的过程中也遇到一些问...

iOS之UIPageController的使用——纯代码实现翻页效果

1、FKPageController类 //.h #import @interface FKPageController : UIViewController @property (assign...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:swift+UIPageViewController 纯代码实现引导页
举报原因:
原因补充:

(最多只允许输入30个字)