欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-17 09:01:04
本文实例为大家分享了pageviewcontroller实现多视图(控制器)滑动切换的具体代码,供大家参考,具体内容如下 先看一下效果动画 类似的界面做过不少,在几...

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

先看一下效果动画

iOS使用pageViewController实现多视图滑动切换iOS使用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分享:pageviewcontroller实现多视图滑动切换

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

上一篇:

下一篇: