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

相关文章

颠覆你的开发模式:敏捷思维带来的无限可能

敏捷软件开发作为现代软件工程的重要方法论,强调快速响应变化和持续交付价值。通过灵活的开发模式和高效的团队协作,敏捷方法在应对动态变化和不确定性方面表现出色。本文将结合学习和分析,探讨系统变化对敏捷开发的影响、业务与技术的对齐以及敏捷方法如何在产品开发过程中处理持续变化和迭代。 系统变化对敏捷软件开发的影响 在敏捷软件开发中,系统变化的管理至关重要。系统变化可以是需求的改变、技术的升级、

使用亚马逊Bedrock的Stable Diffusion XL模型实现文本到图像生成:探索AI的无限创意

引言 什么是Amazon Bedrock? Amazon Bedrock是亚马逊云服务(AWS)推出的一项旗舰服务,旨在推动生成式人工智能(AI)在各行业的广泛应用。它的核心功能是提供由顶尖AI公司(如AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI以及亚马逊自身)开发的多种基础模型(Foundation Models,简称FMs)。

超声波清洗机哪个品牌比较好一点的?清洁力强的超声波清洗机品牌

随着生活水平的不断提升和幸福感的增强,珠宝、饰品和眼镜等物品已成为许多家庭的常备之物。然而,这些贵重细小的物件易于积聚微尘与隐形细菌,长此以往可能悄悄影响家人的健康,毕竟细菌是肉眼难以察觉的隐患。超声波清洗机应运而生,它以高科技手段有效地解决了这一隐忧,深层清洁,守护家人免受微小污染物的潜在威胁。不过现在市面上超声波清洗机品牌挺多的,究竟有哪些品牌的超声波清洗机比较好一点呢?接下来就为大家带来四款

hdu2073(无限的路)

无限的路 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5148    Accepted Submission(s): 2653 Problem Description 甜甜从小就喜欢画图画,最近他买了一支智能画笔,

collectionView 无限轮播图

拿一组4张的轮播图作为例子 思路主要是 1. 拿到一组图片后, 把绿色图1和绿色图4多复制出来一份, 把红色图1(复制的图1)放在最后, 红色图4(复制的绿色图4)放在首位, 现在一共是6张图. 2. 左滑从绿色图1到红色图1时,就迅速把collectionView的contentoffset 设置到图1的位置. 3.右滑时,到红色图4就把collectionView的frame设置到绿色图

Python中的方法重写与多态:解锁编程的无限可能

在编程的世界里,灵活性与扩展性往往是衡量一个语言是否强大、易于维护的关键指标。Python,作为一种被广泛使用的高级编程语言,不仅以其简洁易读的语法赢得了众多开发者的喜爱,更因其支持多种面向对象特性而备受青睐。其中,“方法重写”与“多态”便是两个核心概念,它们不仅能够极大地提高代码的复用性和可维护性,还能帮助我们构建更加灵活、健壮的软件系统。本文将通过一系列由浅入深的例子,带你一起探索这两个概念的

关于证书链的一点认知

文章来源 作者:小叶与小茶 链接:https://www.jianshu.com/p/fcd0572c4765 来源:简书 顾名思义,证书链是由一串数字证书链接而成,为了弄清楚这个概念,先看看什么是数字证书。 一、数字证书的基础知识 数字证书是用来认证公钥持有者身份合法性的电子文档,以防止第三方冒充行为。数字证书由 CA(Certifacate Authority) 负责签发,关

python恶搞无限弹窗脚本

python恶搞无限弹窗代码; 弹窗可以关闭,但是每次关闭都会增加一个出现; 例如关闭一个弹窗会出现两个弹窗; 初始化出现20个弹窗; 部分核心代码 def on_close(top, root):global window_count# 关闭当前窗口top.destroy()window_count -= 1# 创建两个新窗口create_popups(root, 3)def create_

【C++学习(28)】通俗一点讲解:std::bind 回调技术

std::bind 是 C++11 标准库中的一个功能,它允许你“绑定”某些参数到一个函数、成员函数或可调用对象上,从而生成一个新的可调用对象。这种新的可调用对象可以稍后被调用,而且其中一些参数已经被预先设置好了。这在回调函数和异步编程中特别有用。 下面我用一个通俗的例子来解释 std::bind 是如何工作的。 假设场景 假设你有一个家庭厨师,他有一个技能叫做“做饭”。做饭需要两个参数:一

Wyn 商业智能V8.0 新版本来袭,解锁“智造”的无限可能

Wyn商业智能V8.0 版本全新发布,聚焦制造业数字化升级痛点,深度赋能制造业数字化转型升级之路,从无缝集成物联网海量数据,到构建可视化实时分析、监控与预警大屏,全面打通生产制造全生命周期的数据脉络,为您开启工业智能新视界,一键解锁数字化工厂无限可能! Wyn商业智能 V8.0 版本亮点功能一览 1、支持MQTT等采集协议,接入物联网设备数据 全新引入”物联网数据”类型,支持MQTT,Web