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

相关文章

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Java实现图片淡入淡出效果

《Java实现图片淡入淡出效果》在现代图形用户界面和游戏开发中,**图片淡入淡出(FadeIn/Out)**是一种常见且实用的视觉过渡效果,它可以用于启动画面、场景切换、轮播图、提示框弹出等场景,通过... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3