swift+UIPageViewController 纯代码实现引导页
来源:互联网 发布:软件缺陷生命周期 编辑:程序博客网 时间:2024/04/29 22:35
使用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. }}/// 具体承载引导图片的VCclass 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的VCclass 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) ,所以这个狠重要。
0 0
- swift+UIPageViewController 纯代码实现引导页
- ios UIPageViewController+pageControl实现引导页
- swift纯代码实现UITableview总结一
- iOS现成的引导页面的实现:纯代码
- UIPageViewController的使用(Swift)
- swift UI专项训练43 Swift实现APP引导页
- swift----纯代码实现 UITableViewCell单元格的自定义
- Swift - 纯代码实现页面segue跳转,以及参数传递
- Swift - 纯代码实现页面segue跳转,以及参数传递
- Swift纯代码走进UICollectionView
- swift纯代码创建view
- 0代码实现项目引导页
- 一行代码实现Dialog展示引导页
- Swift实现一句代码不用写加载首次启动引导图
- 纯代码实现TabHost
- 纯代码实现 AutoLayout
- 纯代码实现AutoLayout
- 纯代码实现dialog
- Java中synchronized使用的一点见解
- MogileFS与FastDFS的个人见解
- 八大内部排序--希尔排序
- javascript有哪些方法能够实现继承
- docker搭建hadoop分布式集群
- swift+UIPageViewController 纯代码实现引导页
- 字典,数组转化为JsonStr
- 获取shell脚本或命令输出
- Spring Security 3.1 中功能强大的加密工具 PasswordEncoder
- Unity5.0新特性 StateMachineBehaviours
- IOS设计规范一
- 二分法查找
- 华为上机考试-2016-8-29
- setInterval() 方法和setTimeout() 方法