OC 技术 UIPageViewController 小说的翻页效果(源码)

2024-04-02 09:20

本文主要是介绍OC 技术 UIPageViewController 小说的翻页效果(源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

(OC)小说翻页效果,UIPageViewController-代码事例

视频解说
在这里插入图片描述

效果

请添加图片描述

前言

整个页面的代码原理就是一个ViewController,上面添加了一个UIPageViewController,然后UIPageViewController上面在加一个ViewController,当手势翻下一页的时候就调用UIPageViewController的datasource返回NextViewController,当手势前下一页的时候就调用UIPageViewController的datasource返回BackViewController,

定义属性

//翻页控制器
@property (strong, nonatomic) UIPageViewController *pageViewController;
@property (strong, nonatomic) NSArray *pageData;//1-12数组 数据源方法
//保存当前控制器的目的是为了,翻页的时候,用当前控制器拿到当前的页数,看看是否有下一页或者前一页
@property (nonatomic, strong) UIViewController *currentViewController;

初始化 UIPageViewController

初始化 UIPageViewController和数据源

    self.pageData = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"11",@"12"];self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];self.pageViewController.delegate = self;self.pageViewController.dataSource = self;self.pageViewController.doubleSided = NO;//用于确定页面是否具有双面显示。将显示前一页和后一页的内容NextViewController *startingViewController = [self viewControllerAtIndex:0];NSArray *viewControllers = @[startingViewController];[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];[self addChildViewController:self.pageViewController];[self.view addSubview:self.pageViewController.view];self.pageViewController.view.frame = self.view.bounds;[self.pageViewController didMoveToParentViewController:self];// Add the page view controller's gesture recognizers to the book view controller's view so that the gestures are started more easily.self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;

实现 UIPageViewController 的代理方法

// 该方法用于告诉UIPageViewController在不同设备方向下(例如横向或纵向)如何设置页面的脊柱(spine),即两个页面之间的间隔。
- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation
{// 获取当前的视图控制器UIViewController *currentViewController = self.pageViewController.viewControllers[0];// 将当前视图控制器放入数组中NSArray *viewControllers = @[currentViewController];// 设置UIPageViewController的视图控制器为当前视图控制器,并指定方向为向前,带有动画效果[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];// 设置UIPageViewController为双面显示self.pageViewController.doubleSided = YES;// 返回页面脊柱的位置为最小值return UIPageViewControllerSpineLocationMin;
}

实现 UIPageViewController 的数据源方法

#pragma mark - UIPageViewController dataSource methods
// UIPageViewController数据源方法// 前一页
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{// 如果当前页是NextViewController类型if([viewController isKindOfClass:[NextViewController class]]) {// 将当前视图控制器设置为当前控制器self.currentViewController = viewController;// 创建BackViewController实例BackViewController *backViewController = [[BackViewController alloc] init];// 更新BackViewController的视图控制器[backViewController updateWithViewController:viewController];return backViewController;}// 获取当前页的索引NSUInteger index = [self indexOfViewController:(NextViewController *)_currentViewController];// 如果当前页是第一页或者索引未找到,则返回nilif ((index == 0) || (index == NSNotFound)) {return nil;}// 索引减1,返回相应索引的视图控制器index--;return [self viewControllerAtIndex:index];
}// 后一页
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{// 如果当前页是NextViewController类型if([viewController isKindOfClass:[NextViewController class]]) {// 将当前视图控制器设置为当前控制器self.currentViewController = viewController;// 创建BackViewController实例BackViewController *backViewController = [[BackViewController alloc] init];// 更新BackViewController的视图控制器[backViewController updateWithViewController:viewController];return backViewController;}// 获取当前页的索引NSUInteger index = [self indexOfViewController:(NextViewController *)_currentViewController];// 如果索引未找到,则返回nilif (index == NSNotFound) {return nil;}// 索引加1index++;// 如果索引等于数据源总数,则返回nilif (index == [self.pageData count]) {return nil;}// 返回相应索引的视图控制器return [self viewControllerAtIndex:index];
}

定义两个私有方法

传入当前页数,返回当前页数的控制器(包括内容)

#pragma mark - 私有方法 - 传入当前页数,返回当前页数的控制器(包括内容)
- (NextViewController *)viewControllerAtIndex:(NSUInteger)index {if (([self.pageData count] == 0) || (index >= [self.pageData count])) {return nil;}NextViewController *dataViewController = [NextViewController new];dataViewController.value = self.pageData[index];return dataViewController;
}

获取当前控制器的当前页数,用于滑动时判断是否有下一页和前一页

#pragma mark - 私有方法 - 获取当前控制器的当前页数,用于滑动时判断是否有下一页和前一页
- (NSUInteger)indexOfViewController:(NextViewController *)viewController {return [self.pageData indexOfObject:viewController.value];
}

前一个控制器

里面定义了一个方法,用于图片的内容翻页是的翻页效果

- (void)updateWithViewController:(UIViewController *)viewController {self.backgroundImage = [self captureView:viewController.view];
}// 捕捉指定视图的内容并返回 UIImage 对象
- (UIImage *)captureView:(UIView *)view {// 获取视图的边界CGRect rect = view.bounds;// 开始一个图形上下文UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0f);// 获取当前图形上下文CGContextRef context = UIGraphicsGetCurrentContext();// 创建仿射变换,用于翻转图像CGAffineTransform transform = CGAffineTransformMake(-1.0, 0.0, 0.0, 1.0, rect.size.width, 0.0);// 将仿射变换应用于当前图形上下文CGContextConcatCTM(context,transform);// 在当前图形上下文中渲染视图的层[view.layer renderInContext:context];// 从当前图形上下文中获取图像UIImage *image = UIGraphicsGetImageFromCurrentImageContext();// 结束图形上下文UIGraphicsEndImageContext();// 返回捕捉到的图像return image;
}

下一个控制器

下一个控制器比较简单里面就一个label现实小说的内容

- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor colorWithRed:241.0/255.0 green:243.0/255.0 blue:247.0/255.0 alpha:1.0];//正页内容例如是一个label文本self.dataLabel = [UILabel new];self.dataLabel.text = self.value;self.dataLabel.textColor = [UIColor blackColor];self.dataLabel.addTo(self.view).fnt(16).makeCons(^{make.center.equal.view(self.view);});
}

这篇关于OC 技术 UIPageViewController 小说的翻页效果(源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869597

相关文章

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

使用Python实现生命之轮Wheel of life效果

《使用Python实现生命之轮Wheeloflife效果》生命之轮Wheeloflife这一概念最初由SuccessMotivation®Institute,Inc.的创始人PaulJ.Meyer... 最近看一个生命之轮的视频,让我们珍惜时间,因为一生是有限的。使用python创建生命倒计时图表,珍惜时间

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

防近视护眼台灯什么牌子好?五款防近视效果好的护眼台灯推荐

在家里,灯具是属于离不开的家具,每个大大小小的地方都需要的照亮,所以一盏好灯是必不可少的,每个发挥着作用。而护眼台灯就起了一个保护眼睛,预防近视的作用。可以保护我们在学习,阅读的时候提供一个合适的光线环境,保护我们的眼睛。防近视护眼台灯什么牌子好?那我们怎么选择一个优秀的护眼台灯也是很重要,才能起到最大的护眼效果。下面五款防近视效果好的护眼台灯推荐: 一:六个推荐防近视效果好的护眼台灯的