iOS使用pageViewController实现多视图滑动切换
程序员文章站
2023-12-17 09:01:04
本文实例为大家分享了pageviewcontroller实现多视图(控制器)滑动切换的具体代码,供大家参考,具体内容如下
先看一下效果动画
类似的界面做过不少,在几...
本文实例为大家分享了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实现多视图滑动切换
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。