当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS使用pageViewController实现多视图滑动切换

iOS使用pageViewController实现多视图滑动切换

2019年07月24日  | 移动技术网IT编程  | 我要评论

谢热盼,校园霸主之统一黑道,酷派7296评测

本文实例为大家分享了pageviewcontroller实现多视图(控制器)滑动切换的具体代码,供大家参考,具体内容如下

先看一下效果动画

类似的界面做过不少,在几个app中都有用到过,再次之前不了解uipageviewcontroller 曾经的思路有两个现在想想都觉得繁琐。

之前的思路1:使用嵌套,collectionview嵌套,每个item中添加内容

之前的思路2:使用scrollview 在上面创建一个一个的controller 实现左右滑动

这两个思路无疑是可以实现的,并且可以实现每个页面的重用,滑动等都可,唯独一点不好就是当停留在第一页的时候,点击标题栏第五页,那么平移的过程就是第一页到第五页,所有的页面从屏幕快速闪过,并且看到现在很多app都是这样的。在此之前我是用的思路2,为了避免跨页面切换出现的中间几个页面闪过的过程,直接把平移动画关闭了。直到使用了uipageviewcontroller,赶紧把项目中的给换掉了

代码不多150行以内

#import "viewcontroller.h"/// 当前controller
#import "myviewcontroller.h" /// 复用的controller 适用于每个控制器布局相同的情况下,,布局不同就创建不同的controller添加进来
#import "titlecollectionviewcell.h"/// 标题栏使用的collectionviewcell

@interface viewcontroller ()<uipageviewcontrollerdelegate,uipageviewcontrollerdatasource,uicollectionviewdelegate,uicollectionviewdatasource>{

 //// 记录当前页 当前标题位置

 nsinteger ld_currentindex;

}

@property (nonatomic, strong) uipageviewcontroller *pageviewcontroller;
@property (nonatomic, strong) nsmutablearray *controllersarr;/// 控制器数组
@property (nonatomic, strong) nsmutablearray *titlearray; /// 标题数组
@property (nonatomic, strong) uicollectionview *titlecollectionview; /// 标题collectionview

@end

@implementation viewcontroller


- (void)viewdidload {
 [super viewdidload];
 self.view.backgroundcolor = [uicolor whitecolor];
 self.navigationcontroller.navigationbar.translucent = no;
 self.controllersarr = [nsmutablearray array];
 self.titlearray = [nsmutablearray array];
 //// 如果controller布局相同则循环创建myviewcontroller 添加进数组,,如果controller 布局不同 那就创建多个不同controller依次添加数组
 for (int i = 0; i < 10; i++) {
  myviewcontroller *con = [[myviewcontroller alloc]init];
  [self.controllersarr addobject:con];
  nsstring *str = [nsstring stringwithformat:@"第 %d 页", i+1];
  con.titlestring = str;
  [self.titlearray addobject:str];

 }
 [self createcollectionview];
 [self createpageviewcontroller];
 [self setthefirstpage];

}



/// 创建标题collectionview
- (void)createcollectionview{
 uicollectionviewflowlayout *lay = [[uicollectionviewflowlayout alloc] init];
 lay.itemsize = cgsizemake(60, 30);
 lay.minimumlinespacing = 0;
 lay.minimuminteritemspacing = 0;
 lay.scrolldirection = uicollectionviewscrolldirectionhorizontal;
 self.titlecollectionview = [[uicollectionview alloc] initwithframe:cgrectmake(0, 34, 375, 30) collectionviewlayout:lay];
 self.titlecollectionview.showshorizontalscrollindicator = no;
 self.titlecollectionview.backgroundcolor = [uicolor whitecolor];
 self.titlecollectionview.delegate = self;
 self.titlecollectionview.datasource = self;
 [self.titlecollectionview registerclass:[titlecollectionviewcell class] forcellwithreuseidentifier:@"titlereuse"];
 [self.navigationcontroller.view addsubview:self.titlecollectionview];


}

//// 标题collectionview的协议方法

- (nsinteger)collectionview:(uicollectionview *)collectionview numberofitemsinsection:(nsinteger)section{
 return self.titlearray.count;

}

- (uicollectionviewcell *)collectionview:(uicollectionview *)collectionview cellforitematindexpath:(nsindexpath *)indexpath {
 titlecollectionviewcell *cell = [collectionview dequeuereusablecellwithreuseidentifier:@"titlereuse" forindexpath:indexpath];
 cell.titlelabel.text = self.titlearray[indexpath.row];
 if (indexpath.row == ld_currentindex) {
  cell.titlelabel.textcolor = [uicolor orangecolor];

 }else{

  cell.titlelabel.textcolor = [uicolor blackcolor];

 }

 return cell;

}

//// 点击标题左右切换视图控制器------------再也不用看到好几个中间页面从屏幕快速闪过了------
- (void)collectionview:(uicollectionview *)collectionview didselectitematindexpath:(nsindexpath *)indexpath{
 uiviewcontroller *vc = [self.controllersarr objectatindex:indexpath.row];
 if (indexpath.row > ld_currentindex) {
  [self.pageviewcontroller setviewcontrollers:@[vc] direction:uipageviewcontrollernavigationdirectionforward animated:yes completion:^(bool finished) {

  }];

 } else {

  [self.pageviewcontroller setviewcontrollers:@[vc] direction:uipageviewcontrollernavigationdirectionreverse animated:yes completion:^(bool finished) {

  }];

 }
 ld_currentindex = indexpath.row;
 nsindexpath *path = [nsindexpath indexpathforrow:ld_currentindex insection:0];
 [self.titlecollectionview scrolltoitematindexpath:path atscrollposition:uicollectionviewscrollpositioncenteredhorizontally animated:yes];
 [self.titlecollectionview reloaddata];

}



/// 创建pageviewcontroller
- (void)createpageviewcontroller {
 nsdictionary *option = [nsdictionary dictionarywithobject:[nsnumber numberwithinteger:0] forkey:uipageviewcontrolleroptioninterpagespacingkey];
 _pageviewcontroller = [[uipageviewcontroller alloc]initwithtransitionstyle:uipageviewcontrollertransitionstylescroll navigationorientation:uipageviewcontrollernavigationorientationhorizontal options:option];
 _pageviewcontroller.delegate = self;
 _pageviewcontroller.datasource = self;
 [self addchildviewcontroller:_pageviewcontroller];
 [self.view addsubview:_pageviewcontroller.view];

}

/// 展示上一页
- (nullable uiviewcontroller *)pageviewcontroller:(uipageviewcontroller *)pageviewcontroller viewcontrollerbeforeviewcontroller:(uiviewcontroller *)viewcontroller {
 nsinteger index = [self.controllersarr indexofobject:viewcontroller];
 if (index == 0 || (index == nsnotfound)) {
  return nil;

 }

 index--;
 return [self.controllersarr objectatindex:index];

}

/// 展示下一页
- (nullable uiviewcontroller *)pageviewcontroller:(uipageviewcontroller *)pageviewcontroller viewcontrollerafterviewcontroller:(uiviewcontroller *)viewcontroller {
 nsinteger index = [self.controllersarr indexofobject:viewcontroller];
 if (index == self.controllersarr.count - 1 || (index == nsnotfound)) {
  return nil;

 }

 index++;
 return [self.controllersarr objectatindex:index];

}

/// 将要滑动切换的时候
- (void)pageviewcontroller:(uipageviewcontroller *)pageviewcontroller willtransitiontoviewcontrollers:(nsarray<uiviewcontroller *> *)pendingviewcontrollers {
 uiviewcontroller *nextvc = [pendingviewcontrollers firstobject];
 nsinteger index = [self.controllersarr indexofobject:nextvc];
 ld_currentindex = index;

}

/// 滑动结束后
- (void)pageviewcontroller:(uipageviewcontroller *)pageviewcontroller didfinishanimating:(bool)finished previousviewcontrollers:(nsarray<uiviewcontroller *> *)previousviewcontrollers transitioncompleted:(bool)completed {
 if (completed) {
  nsindexpath *path = [nsindexpath indexpathforrow:ld_currentindex insection:0];
  [self.titlecollectionview scrolltoitematindexpath:path atscrollposition:uicollectionviewscrollpositioncenteredhorizontally animated:yes];
  [self.titlecollectionview reloaddata];

  nslog(@">>>>>>>>> %ld", (long)ld_currentindex);

 } 

}

/// 设置默认显示的是哪个页面(controller)
- (void)setthefirstpage{
 uiviewcontroller *vc = [self.controllersarr objectatindex:ld_currentindex];
 [self.pageviewcontroller setviewcontrollers:@[vc] direction:uipageviewcontrollernavigationdirectionreverse animated:yes completion:nil];

}

- (void)didreceivememorywarning {
 [super didreceivememorywarning];
 // dispose of any resources that can be recreated.

}

titlecollectionviewcell
@implementation titlecollectionviewcell


- (instancetype)initwithframe:(cgrect)frame{
 self = [super initwithframe:frame];
 if (self) {
  [self createview];

 }
 return self;

}

- (void)createview{
 self.titlelabel = [[uilabel alloc] initwithframe:cgrectmake(0, 0, self.contentview.frame.size.width, self.contentview.frame.size.height)];
 [self.contentview addsubview:self.titlelabel];
 self.titlelabel.font = [uifont systemfontofsize:14];

}
@end

demo分享:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网