UIScrollView的无限左滑轮播一点也不难

2024-06-13 06:32

本文主要是介绍UIScrollView的无限左滑轮播一点也不难,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UIScrollView的轮播在如今的app中用得十分广泛,最初实现的时候方式比较拙劣,滚动到最后一个视图时再返回到第一个看起来非常的不连贯。

今天查询UIScrollView轮播资料,总结两种比较喜欢也易于理解的方法:

1、UIScrollView显示的子视图左右各放一个多出来的子视图,如本来有A/B/C三张图片,在A前面放一个ImageView显示C,在C后天放一个ImageView显示A,即C/A/B/C/A。

初始化ScrollView的时候,contentoffset 从A开始,然后 setContentOffset:offSetanimated:YES 依次轮播,当播放到C之后,跳转到A后,在

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 中替换其contentoffset为第一个A的contentoffset。

代码如下:

- (void)viewDidLoad
{[super viewDidLoad];_scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(10, 0, 300, 300)];_scrollView.frame = CGRectMake(10, 0, 300, 300);_scrollView.contentSize = CGSizeMake(300*5, 300);_scrollView.contentOffset = CGPointMake(300, 0);_scrollView.delegate = self;[self.view addSubview:_scrollView];UIImageView *imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];imageView1.image = [UIImage imageNamed:@"3.jpg"];[_scrollView addSubview:imageView1];UIImageView *imageView2 = [[UIImageView alloc] initWithFrame:CGRectMake(300, 0, 300, 300)];imageView2.image = [UIImage imageNamed:@"1.jpg"];[_scrollView addSubview:imageView2];UIImageView *imageView3 = [[UIImageView alloc] initWithFrame:CGRectMake(300*2, 0, 300, 300)];imageView3.image = [UIImage imageNamed:@"2.jpg"];[_scrollView addSubview:imageView3];UIImageView *imageView4 = [[UIImageView alloc] initWithFrame:CGRectMake(300*3, 0, 300, 300)];imageView4.image = [UIImage imageNamed:@"3.jpg"];[_scrollView addSubview:imageView4];UIImageView *imageView5 = [[UIImageView alloc] initWithFrame:CGRectMake(300*4, 0, 300, 300)];imageView5.image = [UIImage imageNamed:@"1.jpg"];[_scrollView addSubview:imageView5];//  设置时钟动画 定时器NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(update:) userInfo:nil repeats:YES];//  将定时器添加到主线程[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}

- (void)update:(NSTimer *)timer{CGPoint offSet = self.scrollView.contentOffset;offSet.x += 300;[self.scrollView setContentOffset:offSet animated:YES];
}- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{CGFloat X = self.scrollView.contentOffset.x;if (X == 0) {self.scrollView.contentOffset = CGPointMake(300*3, 0);}if (X == 300*4) {self.scrollView.contentOffset = CGPointMake(300, 0);}
}
这是方法1。里面的图片是随意在网上找的。

2、方法二是用固定的三个UIImageView控件,然后替换其图片来实现。

具体思路:先初始化三个图片控件,然后第一个控件放最后一张图,第二个图片放第一张图,第三个控件放第2张图。如轮播A/B/三个图片时,显示顺序是C/A/B。

后面的思路与上面类似,只不过要进行image替换。直接上代码:

- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.UIScrollView *scrollView =[[UIScrollView alloc] init];scrollView.frame = CGRectMake(0, 0, width, height);[self.view addSubview:scrollView];self.scrollView = scrollView;[self.scrollView setContentSize:CGSizeMake(width * 3, height)];//  设置隐藏横向条self.scrollView.showsHorizontalScrollIndicator = NO;//  设置自动分页self.scrollView.pagingEnabled = YES;//  设置代理self.scrollView.delegate = self;//  设置当前点self.scrollView.contentOffset = CGPointMake(width, 0);//  设置是否有边界self.scrollView.bounces = NO;//  初始化当前视图UIImageView *currentImageView =[[UIImageView alloc] init];currentImageView.image = [UIImage imageNamed:@"1.jpg"];[self.scrollView addSubview:currentImageView];self.currentImageView = currentImageView;self.currentImageView.frame = CGRectMake(width, 0, width, height);self.currentImageView.contentMode = UIViewContentModeScaleAspectFill;//  初始化下一个视图UIImageView *nextImageView = [[UIImageView alloc] init];nextImageView.image = [UIImage imageNamed:@"2.jpg"];[self.scrollView addSubview:nextImageView];self.nextImageView = nextImageView;self.nextImageView.frame = CGRectMake(width * 2, 0, width, height);self.nextImageView.contentMode = UIViewContentModeScaleAspectFill;//  初始化上一个视图UIImageView *preImageView =[[UIImageView alloc] init];preImageView.image = [UIImage imageNamed:@"3.jpg"];preImageView.frame = CGRectMake(0, 0, width, height);[self.scrollView addSubview:preImageView];self.preImageView = preImageView;self.preImageView.contentMode =UIViewContentModeScaleAspectFill;//  设置时钟动画 定时器self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(update:) userInfo:nil repeats:YES];//  将定时器添加到主线程[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];}
- (void)update:(NSTimer *)timer{//定时移动if (_isDragging == YES) {return ;}CGPoint offSet = self.scrollView.contentOffset;offSet.x +=offSet.x;[self.scrollView setContentOffset:offSet animated:YES];}
// 开始拖动
- (void) scrollViewDidScroll:(UIScrollView *)scrollView{static int i =1; //   当前展示的是第几张图片float offset = self.scrollView.contentOffset.x;if (self.nextImageView.image == nil || self.preImageView.image == nil) {//  加载下一个视图NSString *imageName1 = [NSString stringWithFormat:@"%d.jpg",i == KOUNT ? 1:i +1];_nextImageView.image = [UIImage imageNamed:imageName1];// 加载上一个视图NSString *imageName2 = [NSString stringWithFormat:@"%d.jpg",i==1 ? KOUNT :i-1];_preImageView.image = [UIImage imageNamed:imageName2];}if(offset ==0){_currentImageView.image = _preImageView.image;scrollView.contentOffset = CGPointMake(width, 0);_preImageView.image = nil;if (i == 1) {i =KOUNT;} else{i-=1;}}if (offset == width * 2) {_currentImageView.image = _nextImageView.image;scrollView.contentOffset = CGPointMake(width, 0);_nextImageView.image = nil;if (i == KOUNT) {i  =1 ;}else{i +=1 ;}}}
主要思路都是在滑动的动画执行完毕后,在用非动画方法移动的相同区域。

这篇关于UIScrollView的无限左滑轮播一点也不难的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

关于CPU的一点知识

首先说一下,CPU是干啥的: CPU所负责的就是解释和运行最终转换成机器语言的程序内容 我们需要知道的CPU结构:重点需要关注寄存器 运算器 简单说就是负责运算从内存读取到寄存器中的数据,可以看作一个数据加工厂,就是对寄存器中的数据做运算,这些运算包含基本的算术和逻辑运算。 算术逻辑单元(ALU) 这个是运算器中重要的一个组成,主要负责的就是对数据的处理,从而实现对数据的算术和

三十八篇:架构大师之路:探索软件设计的无限可能

架构大师之路:探索软件设计的无限可能 1. 引言:架构的艺术与科学 在软件工程的广阔天地中,系统架构不仅是设计的骨架,更是灵魂所在。它如同建筑师手中的蓝图,决定了系统的结构、性能、可维护性以及未来的扩展性。本节将深入探讨软件架构的定义、其在系统设计中的核心作用,以及不同架构风格对系统特性的影响。 软件架构的定义及其在系统设计中的核心作用 软件架构,简而言之,是指软件系统的基本组织结构,

随笔(一点感悟

听说要成为真正的强者,就要承受七重的孤独,于我而言,大抵确实如此,现在我的生活就是不断的进步不断地进步,我舍弃掉了99%占据我时间对我长期发展无益的事了,我在不断的磨练自己的精神与身体。在我很弱不知道如何进步的时候,我总是幻想一个强者是怎样怎样的,当我真正走上这条路的时候,我才明白,强者之所以是强者,那是因为它们每一天都比昨天的自己强,这才是一个真正的强者最需要的品质,无论先天差异有多大,磨练到最

关于“程序闪退,没有生成DUMP文件”的一点总结

今早一回到公司,测试的同事就反映,昨晚程序运行一段时间后闪退了。。。。闪退???额,好吧,幸好我有加写DUMP的代码,示例如下: LONG WINAPI UnhandledExceptionFunction(_EXCEPTION_POINTERS* pExceptionInfo){SYSTEMTIME st;GetLocalTime(&st);CString time_now = _T("")

关于使用SetPriorityClass将进程设置为PROCESS_MODE_BACKGROUND_BEGIN的一点总结

一、背景 早上在B站看到了下面这个视频 【Win系统旧代码导致CPU干冒烟?谷歌程序员惨背锅】 然后想起自己上一年处理了公司某个项目的同样的问题,于是就来总结一下使用SetPriorityClass将进程设置为PROCESS_MODE_BACKGROUND_BEGIN后的相关问题。 二、代码 下面是一个demo代码,我们先来看下代码的正常运行情况下在procexp下的表现。procexp

IOS Swift 从入门到精通: For 循环, While 循环, 重复循环, 退出循环, 退出多重循环, 跳过项目, 无限循环

文章目录 For 循环While 循环重复循环退出循环退出多重循环跳过项目无限循环总结 For 循环 Swift 有几种编写循环的方法,但它们的底层机制是相同的:重复运行一些代码,直到条件计算为假。 Swift 中最常见的循环是一个for循环:它将循环遍历数组和范围,并且每次循环时它都会取出一个项目并分配给一个常量。 例如,这里有一个数字范围: let count = 1.

[Qt]Qt框架解析:从入门到精通,探索平台开发的无限可能

一、Qt的概述         Qt是一个跨平台的C++图形用户界面应用程序框架(GUI)。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。开发环境为Qt creator5.8.0,下载网址:http://download.qt.io/archive/qt/ 二、创建工程 1、准备工作 (1)点击工具中选项 (2)设置编

解决无限debugger总结

基本工具 1: Notepad(修改保存) + ReRes(插件替换) ReRes安装教程 2: Fidder + 编程猫 + hook 情况 fidder基本:fidder插件使用hook构造器, 例如下 //配合编程猫专用工具进行hook(function() {'use strict'//过瑞数 debugervar eval_ = window.eval;window.ev

uniapp 封装的插件集合 包括:无限级选择器,TAB滑动切换,圆形进度条,上拉加载动画,动画使用,通用弹窗等。

uniapp 封装的插件集合 包括:无限级选择器,TAB滑动切换,圆形进度条,上拉加载动画,动画使用,通用弹窗等。 作者:神夜 QQ:564379992 交流群:942832552 插件下载地址:https://gitee.com/sywlgzs/uniapp-componentsuniapp 插件集合大全: uniapp 封装的插件集合 包括:无限级选择器,TAB滑动切换,圆形进度条,上