轮播图的无限轮播

简介

在现在的一些App中常常见到图片轮播器,一般用于展示广告、新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScrollView的允许分页设置,可以实现滚动轮播的功能。

轮播原理

UIScrollView对象有pagingEnable成员,如果设置为YES,那么每一个scrollView尺寸这么大的区域就会被当作一页,在滚动时会根据滚动的比例自动计算应该切换到哪一页。

无限滚动原理

要实现无限滚动,需要额外的两张图片,假设我们的图片有五张,存在images数组中,那么我们在将图片插入到scrollView中时,在第一张图片前面插入一个最后一张图片作为辅助图片,在最后一张后面插入一个第一张图片作为辅助图片。这样,当滚动到第一张前面一张时,在页面切换结束后无动画的切换scrollView的偏移量为最后一张图片(不包含最后一张后面的第一张那个辅助图片),这样就实现了由辅助图片到真实图片的过渡,之所以设置辅助图片是为了在滚动中看到那个真实图片。同理,当滚动到最后一张的后面一张时,我们吧scrollView的偏移量设置为第一张图片即可。

具体的代码实现

这个代码是在开发一个项目中所写的,已经封装称一个View,只需要调用initWithFrame指定轮播器尺寸,然后通过设置images成员的值即可实现无限滚动的轮播。

// .h
//
//  ESPicPageView.h
//  享技
// // Created by 11 on 11/30/15. // Copyright © 2015 soulghost. All rights reserved. // #import <UIKit/UIKit.h> @interface ESPicPageView : UIView @property (nonatomic, strong) NSArray *images; @end // -------------------------------------------- // .m // // ESPicPageView.m // 享技 // // Created by 11 on 11/30/15. // Copyright © 2015 soulghost. All rights reserved. // #import "ESPicPageView.h" #import "UIImageView+WebCache.h" @interface ESPicPageView () <UIScrollViewDelegate> @property (nonatomic, weak) UIScrollView *scrollView; @property (nonatomic, weak) UIPageControl *pageControl; @property (nonatomic, assign) CGFloat imgW; @property (nonatomic, assign) CGFloat imgH; @property (nonatomic, strong) NSTimer *timer; @property (nonatomic, strong) NSArray *imageViews; @property (nonatomic, assign) NSInteger imageCount; @end @implementation ESPicPageView - (instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { self.backgroundColor = [UIColor blueColor]; UIScrollView *scrollView = [[UIScrollView alloc] init]; self.scrollView = scrollView; self.scrollView.delegate = self; self.scrollView.pagingEnabled = YES; self.scrollView.showsHorizontalScrollIndicator = NO; self.scrollView.backgroundColor = [UIColor whiteColor]; [self addSubview:scrollView]; self.imgW = frame.size.width; self.imgH = frame.size.height; [self setNeedsLayout]; UIPageControl *pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(frame.size.width - 50, frame.size.height - 10, 0, 0)]; self.pageControl = pageControl; self.pageControl.numberOfPages = 1; [self addSubview:pageControl]; self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; } return self; } - (void)nextImage{ NSInteger page = self.pageControl.currentPage; page = self.pageControl.currentPage + 1; CGPoint offset = CGPointMake((1 + page) * self.imgW, 0); [self.scrollView setContentOffset:offset animated:YES]; } - (void)setupImageViews{ for (int i = 0; i < self.images.count + 2; i++) { UIImageView *imageView = [[UIImageView alloc] init]; CGFloat imageX = i * self.imgW; CGFloat imageY = 0; CGFloat imageW = self.imgW; CGFloat imageH = self.imgH; imageView.frame = CGRectMake(imageX, imageY, imageW,imageH); [self.scrollView insertSubview:imageView atIndex:0]; } } - (NSArray *)imageViews{ if (_imageViews == nil) { NSMutableArray *arr = [NSMutableArray array]; for (int i = 0; i < self.images.count + 2; i++) { UIImageView *imageView = [[UIImageView alloc] init]; CGFloat imageX = i * self.imgW; CGFloat imageY = 0; CGFloat imageW = self.imgW; CGFloat imageH = self.imgH; imageView.frame = CGRectMake(imageX, imageY, imageW,imageH); [self.scrollView insertSubview:imageView atIndex:0]; [arr addObject:imageView]; } _imageViews = arr; } return _imageViews; } - (void)setImages:(NSArray *)images{ _images = images; self.imageCount = images.count; self.pageControl.numberOfPages = self.imageCount; [self addPics]; } - (void)addPics{ for (int i = 0; i < self.images.count + 2; i++) { UIImageView *imageView = self.imageViews[i]; if (i == 0) { imageView.image = [self.images lastObject]; }else if(i == self.images.count + 1){ imageView.image = [self.images firstObject]; }else{ imageView.image = self.images[i - 1]; } } } - (void)layoutSubviews{ [super layoutSubviews]; 

转载于:https://www.cnblogs.com/jx66/p/6268533.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构链表之单链表的快慢指针——3

单链表之快慢指针 单链表的快慢指针简介 快慢指针指链表中定义两个指针&#xff0c;两个指针的移动速度一快一慢&#xff0c;一般快指针移动步长为慢指针的两倍 快慢指针适合解决的几个典型问题 中间值问题单向链表是否有环问题有环链表的入口问题 先定义一个简单的节点 …

C语言产随机数

#include "stdio.h" #include "stdlib.h" #include "time.h"void main(void) {int i;srand((unsigned)time(NULL));while(1){irand()%100;printf("%d\n",i);} }

【Pytorch神经网络基础理论篇】 04 线性代数

同学你好&#xff01;本文章于2021年末编写&#xff0c;已与实际存在较大的偏差&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)…

Bootstrap实现弹出框和提示框效果代码

一、Bootstrap弹出框使用过JQuery UI应该知道&#xff0c;它里面有一个dialog的弹出框组件&#xff0c;功能也很丰富。与jQuery UI的dialog类似&#xff0c;Bootstrap里面也内置了弹出框组件。打开bootstrap 文档可以看到它的dialog是直接嵌入到bootstrap.js和bootstrap.css里面…

数据结构链表之循环链表——4

循环链表与约瑟夫问题 循环链表定义 定义&#xff1a;循环链表的定义十分简单&#xff0c;只需使一条单链表的尾部结点指向头结点&#xff0c;即可完成循环链表 循环链表的构建 class Node:def __init__(self, item):self.item itemself.next Nonefirst Node(aa) secon…

【Pytorch神经网络基础理论篇】 05 矩阵计算

同学你好&#xff01;本文章于2021年末编写&#xff0c;已与实际存在较大的偏差&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)…

统计iOS项目的总代码行数的方法

1、打开终端&#xff0c; 2、用cd命令 定位到工程所在的目录&#xff0c;然后调用以下命名即可把每个源代码文件行数及总数统计出来&#xff1a; find . "(" -name "*.m" -or -name "*.mm" -or -name "*.cpp" -or -name "*.h&quo…

【Pytorch神经网络基础理论篇】 06 自动求导+导数与微分

同学你好&#xff01;本文章于2021年末编写&#xff0c;已与实际存在较大的偏差&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)…

EXPORT_SYMBOL

linux2.6的“/prob/kallsyms”文件对应着内核符号表&#xff0c;记录了符号以及符号所在的内存地址。 模块可以使用如下宏导出符号到内核符号表&#xff1a; [c-sharp] view plaincopy EXPORT_SYMBOL(符号名); EXPORT_SYMBOL_GPL(符号名) 导出的符号可以被其他模块使用&…

数据结构链表之栈,Python3简单实现——5

数据结构链表之栈 栈的概述 定义&#xff1a;栈是一种基于先进后出(FILO)的数据结构&#xff0c;是一种只能在一段进行插入和删除操作的特殊线性表。引入名词&#xff1a;将数据存入栈的动作称为压栈&#xff0c;将数据取出栈的动作称为弹栈栈的特点&#xff1a;先进入栈的元…

【转】【Linux】linux awk命令详解

简介 awk是一个强大的文本分析工具&#xff0c;相对于grep的查找&#xff0c;sed的编辑&#xff0c;awk在其对数据分析并生成报告时&#xff0c;显得尤为强大。简单来说awk就是把文件逐行的读入&#xff0c;以空格为默认分隔符将每行切片&#xff0c;切开的部分再进行各种分析处…

8X25Q充电部分软件梳理(CP侧)

分享链接&#xff1a;http://note.youdao.com/share/?id4f6665eee6bad5ea27eee47f74bcfa4b&typenote 8X25Q充电部分软件梳理&#xff08;CP侧&#xff09; 作者&#xff1a;韦启发 目录 1、过放电池的充电阶段介绍... 2 2、Autonomous充电介绍... 5 3、USB充电器检测... 6…

【Pytorch神经网络基础理论篇】 08 Softmax 回归 + 损失函数 + 图片分类数据集

同学你好&#xff01;本文章于2021年末编写&#xff0c;已与实际存在较大的偏差&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)…

CI Weekly #11 | 微服务场景下的自动化测试与持续部署

又一周过去了&#xff0c;最近我们的工程师正在搞一个“大事情” ——「flow.ci 配置文件」&#xff0c;稍微剧透一下&#xff0c;这个功能预计会在春节前上线。详情请大家关注 flow.ci Changelog 或其他官方通知:) 本期 CI Weekly 收录了的CI/CD实践、微服务自动化测试与持续部…

数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6

括号匹配问题和逆波兰表达式求值问题 基于上一节已经使用python代码对栈进行了简单的实现&#xff0c;这一节我们在其基础上解决两个常见的问题 案例 括号匹配问题(点我直接到代码实现)逆波兰表达式求值问题(点我直接到代码实现) 括号匹配问题 在给定的字符串中&#xff0…

ubuntu server 12.04中文显示不完整

发现有台服务器ubuntu server 12.04在远程过去时文件名的中文现实没有问题&#xff0c;但ls的时候时间居然乱码。 搜索了一下&#xff0c;应该是locale的问题&#xff0c;可以这样处理&#xff1a; 1. 编辑/var/lib/locales/supported.d/local文件&#xff0c;内容改成如下&am…

Java_基础阶段笔记总结汇总

一、Java简介 1、Java语言平台性介绍 2、JDK_JRE_JVM的组成和作用 JVM: Java虚拟机&#xff0c;是专门用来运行Java程序的,但是不能单独安装 JRE: Java运行环境&#xff0c;包含JVM(Java虚拟机,是专门用来运行Java程序的)和核心类库 JDK: Java开发工具包&#xff0c;包含JRE和…

数据结构链表之队列,Python3实现——7

数据结构链表之队列 队列概述 定义&#xff1a;队列是一种基于先进先出(FIFO)的数据结构&#xff0c;队列只能在一段进行插入和删除操作的结构&#xff0c;第一个进入队列的元素在读取时会第一个被读取 队列可以使用顺序表(Python中列表)实现&#xff0c;也可以用链表实现&am…

IDEA上Debug调试全流程

一、什么是Debug模式 是供程序员使用的程序调试工具&#xff0c;它可以用于查看程序的执行流程&#xff0c;也可以用于追踪程序执行过程来调试程序。使用IDEA的断点调试功能&#xff0c;查看程序的运行过程 Debug调试窗口介绍。 二、Debug模式操作流程【应用】 能够使用断点调…

数据结构链表之符号表,Python3实现——8

数据结构链表之符号表 符号表的介绍 之前章节介绍的顺序表和链表都是一个节点储存一个元素的表&#xff0c;但在日常生活中我们还有很多一次需要储存成对或多个值的情况&#xff0c;例如&#xff1a; 符号表最主要的目的将一对元素&#xff0c;用一个键和一个值将其联系起来&…