UIScrollView 循环滚动,代码超简单
如今非常多应用里面多多少少都用到了循环滚动,要么是图片、要么是view,或者是其它,我总结一下,写了个demo分享给大家。
先看代码之后在讲原理:
1.创建一个空的项目(这个我就不多说了)。
2.加入一个ViewController。
3.在appdelegate加入:
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
- self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
- ViewController *vc = [[ViewController alloc] init];
- self.window.rootViewController = vc;
- self.window.backgroundColor = [UIColor whiteColor];
- [self.window makeKeyAndVisible];
- return YES;
- }
4.看看ViewController.m里面的文件:
- <span style="font-size:14px;">#import "ViewController.h"
- @interface ViewController ()<UIScrollViewDelegate>
- @property (nonatomic, strong) UIScrollView *readCannelScrollView;
- @property (nonatomic, strong) UILabel *pageOneView;
- @property (nonatomic, strong) UILabel *pageTwoView;
- @property (nonatomic, strong) UILabel *pageThreeView;
- @end
- @implementation ViewController
- - (void)dealloc
- {
- _readCannelScrollView = nil;
- _pageOneView = nil;
- _pageTwoView = nil;
- _pageThreeView = nil;
- }
- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
- {
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- // Custom initialization
- }
- return self;
- }
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- //容器的属性设置
- self.readCannelScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
- [self.view addSubview:self.readCannelScrollView];
- CGSize size = self.readCannelScrollView.contentSize;
- size.width = 320*3;
- self.readCannelScrollView.contentSize = size;
- self.readCannelScrollView.pagingEnabled = YES;
- self.readCannelScrollView.showsHorizontalScrollIndicator = NO;
- self.readCannelScrollView.delegate = self;
- self.readCannelScrollView.contentOffset = CGPointMake(0, 0);
- //end
- //加入页面1
- self.pageOneView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, self.view.bounds.size.height)];
- self.pageOneView.backgroundColor = [UIColor lightGrayColor];
- self.pageOneView.text = @"1";
- self.pageOneView.font = [UIFont systemFontOfSize:80];
- self.pageOneView.textAlignment = NSTextAlignmentCenter;
- [self.readCannelScrollView addSubview:self.pageOneView];
- //加入页面2
- self.pageTwoView = [[UILabel alloc] initWithFrame:CGRectMake(320, 0, 320, self.view.bounds.size.height)];
- self.pageTwoView.backgroundColor = [UIColor greenColor];
- self.pageTwoView.text = @"2";
- self.pageTwoView.font = [UIFont systemFontOfSize:80];
- self.pageTwoView.textAlignment = NSTextAlignmentCenter;
- [self.readCannelScrollView addSubview:self.pageTwoView];
- //加入页面3
- self.pageThreeView = [[UILabel alloc] initWithFrame:CGRectMake(640, 0, 320, self.view.bounds.size.height)];
- self.pageThreeView.backgroundColor = [UIColor grayColor];
- self.pageThreeView.text = @"3";
- self.pageThreeView.font = [UIFont systemFontOfSize:80];
- self.pageThreeView.textAlignment = NSTextAlignmentCenter;
- [self.readCannelScrollView addSubview:self.pageThreeView];
- }
- - (void)didReceiveMemoryWarning
- {
- [super didReceiveMemoryWarning];
- }
- #pragma mark -
- #pragma mark - scroll delegate
- <span style="color:#996633;">- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView
- {
- NSLog(@"scrollView.contentOffset.x=%f",scrollView.contentOffset.x);
- CGFloat pageWidth = scrollView.frame.size.width;
- int currentPage = floor((scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1;
- if (currentPage == 0)
- {
- UILabel *tmpTxtView = self.pageThreeView;
- self.pageThreeView = self.pageTwoView;
- self.pageTwoView = self.pageOneView;
- self.pageOneView = tmpTxtView;
- }
- if (currentPage == 2)
- {
- //换指针
- UILabel *tmpTxtView = self.pageOneView;
- self.pageOneView = self.pageTwoView;
- self.pageTwoView = self.pageThreeView;
- self.pageThreeView = tmpTxtView;
- }
- //恢复原位
- self.pageOneView.frame = (CGRect){0,0,self.pageOneView.frame.size};
- self.pageTwoView.frame = (CGRect){320,0,self.pageTwoView.frame.size};
- self.pageThreeView.frame = (CGRect){640,0,self.pageThreeView.frame.size};
- self.readCannelScrollView.contentOffset = CGPointMake(320, 0);
- }
- @end</span>
5.原理说明,小伙伴我们一起想一下。怎样让一个scrollview实现循环滚动。看下图:
a.用三个View进行循环滚动,上图P1、P2、P3(程序中的pageOneView、pageTwoView、pageThreeView)
b.(開始执行除外。那是的contentoffset.x = 0)始终让P2在中间是实现循环滚动的关键。
c.P2此时在中间(如上图)即contentoffset.x = 320。此时再向左滑动。P3在中间页面,即contentoffset.x = 640。
d.这时候,肯定会想,是不是把P1移动到TEMP0的位置。小伙伴你真聪明。可是为了写成一个通用方法,光是移动位置是不正确的,那能不能保证P1、P2、P3这个顺序永远不变,答案是YES。
e.1>永远保持P1、P2、P3顺序。同一时候。位置(frame)也要同样 2>让P2用于居中。
f.满足e中两条,怎样做到:首先e的第一条看上图,滑动后的界面最右边有个红色虚拟的框框。假设假设(实际上没有移动)我把P1放到那个位置,顺序就是P2\P3\P1(TEMP0),为了保证顺序,我须要交换指针。可是假设我直接把指针P1=P2。在运行P3=P1时候。会有问题的。你懂的。在进行换值的时候须要借助暂时指针变量的。
g.指针换完了,可是位置没有变contentoffset.x = 640,我们须要scrollView.contentoffset.x = 320。
h.上述是想左滑动。向右滑动,即是同理。
6.程序分析说明:
- <span style="font-size:14px;">CGFloat pageWidth = scrollView.frame.size.width;
- int currentPage = floor((scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1;</span>
floor计算 的出来是0、1、2,能够利用是0还是2进行推断用户是向左滑动,还是向右滑动。从而实现循环滚动,后台在配合数组的使用。就能够实现图片等循环滚动啦!
UIScrollView 循环滚动,代码超简单的更多相关文章
- APP中常见上下循环滚动通知的简单实现,点击可进入详情
APP中常见上下循环滚动通知的简单实现,点击可进入详情 关注finddreams博客,一起分享一起进步!http://blog.csdn.net/finddreams/article/details/ ...
- UIScrollView循环滚动1
现在基本每一个商业APP都会有循环滚动视图,放一些轮播广告之类的,都是放在UIScrollView之上.假如我要实现N张图片的轮播,我借鉴了几个博文,得到两种方法实现: [第一种]:如下图(图片来源于 ...
- NGUI实现的一套不同大小 Item 的循环滚动代码
测试: 数据 & Item 的 Ctrl : using UnityEngine; public class ScrollViewItemData { public int index; p ...
- 实现图片的循环滚动——JS的简单应用
首先默认都了解JS的循环分支运算符等基本语法 用CSS实现简单的布局也是会的. 然后我们就可以来了解一下 [DOM 树节点] 它分为三大类:元素节点.文本节点.属性节点 文本节点跟属性节点为元素节点的 ...
- iOS之UIScrollView循环滚动
#import "ViewController.h" #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width #d ...
- javaWeb实现验证码--代码超简单
1.前端显示 HTML: <h3>验证码:</h3> <input type="text" name="validationCode&quo ...
- 用Python写一个随机数字生成代码,5行代码超简单
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 第一步,安装 random 库 random库是使用随机数的Python标准库 ...
- jQuery倒计时代码(超简单)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...
- JavaScript学习笔记——简单无缝循环滚动展示图片的实现
今天做了一个简单的无缝循环滚动的实例,这种实例在网页中其实还挺常见的,下面分享一下我的学习收获. 首先,无缝滚动的第一个重点就是——动.关于怎么让页面的元素节点动起来,这就得学明白关于JavaScri ...
随机推荐
- [CC-STREETTA]The Street
[CC-STREETTA]The Street 题目大意: 给定两个长度为\(n(n\le10^9)\)的数列\(A\)和\(B\),开始数列\(A\)中每一项值为\(-\infty\),数列\(B\ ...
- bzoj 1051 强连通分量
反建图,计算强连通分量,将每个分量看成一个点,缩点后的图是一个DAG,如果是一棵树,则根代表的连通分量的大小就是答案,否则答案为0. 收获: 图的东西如果不好解决,可以尝试缩点(有向图将每个强连通分量 ...
- Spark参数配置总结
- org.apache.curator:master选举和分布式锁
1. master选举(LeaderSelector) 1)LeaderSelector构造函数 在leaderPath上建立分布式锁:mutex = new InterProcessMutex(cl ...
- HDU 5640 King's Cake GCD
King's Cake 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5640 Description It is the king's birthd ...
- JProfiler 5.1.4的使用方法
1. JProfiler运行环境配置 安装目录结构如下,子目录中显示了支持的操作系统: 在服务器和客户端都要安装JProfiler,并且要安装License,在分析工具客户端中进行安装.Windows ...
- Current limiter allows large USB bypass capacitance
The USB (Universal Serial Bus) specification requires a connected USB device to present a load to th ...
- GNU 是什么?
https://www.gnu.org/ GNU 是什么? GNU is a Unix-like operating system that is free software—it respects ...
- 夏书祥-苹果iPhone多开
微信多开:就是在手机上开多个微信应用,比方同一时候打开3个微信软件. 安卓微信多开下载地址:http://yunpan.cn/cZBvE42E7qQkf 訪问password 8509 苹果微信多开 ...
- VS2010 VC++ 项目添加引用 出现 Internal CPS Error问题原因及解决办法
在VS2010 VC++ 项目添加引用时,有时会出现Internal CPS Error错误,提示信息: 'Internal CPS Error: We couldn't find the exist ...