博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UIScrollView 循环滚动,代码超简单
阅读量:7233 次
发布时间:2019-06-29

本文共 4990 字,大约阅读时间需要 16 分钟。

如今非常多应用里面多多少少都用到了循环滚动,要么是图片、要么是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里面的文件:

#import "ViewController.h"@interface ViewController ()
@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
- (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

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.程序分析说明:

  

CGFloat pageWidth = scrollView.frame.size.width;int currentPage = floor((scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1;

floor计算 的出来是0、1、2,能够利用是0还是2进行推断用户是向左滑动,还是向右滑动。从而实现循环滚动,后台在配合数组的使用。就能够实现图片等循环滚动啦!

你可能感兴趣的文章
腾讯动漫回应停止支付作者稿酬传闻:均会按时如数支付
查看>>
卫健委:保障病人就医需求 加强流感药品物资保障
查看>>
因无力偿还网贷 内蒙古一对夫妻贩卖亲生龙凤胎
查看>>
2018年深圳出口规模续称雄 新业态进出口倍增
查看>>
第二届EmTech China 峰会在京举行 畅谈科技创新未来
查看>>
证监会对6宗内幕交易案件作出行政处罚 涉及现代制药等
查看>>
张近东智慧零售大开发加码:2019年开店15000家
查看>>
西班牙一亚洲女子疑似被人从三楼推落 伤势严重
查看>>
学习Python编程语言-这28本有关Python书籍值得去了解
查看>>
刚刚,蚂蚁区块链喜提“世界互联网领先科技成果”
查看>>
后端工程师入门前端页面重构(一):口诀
查看>>
广州三本找Java实习经历
查看>>
初识 weex 系列(前端视角) - 基础完结
查看>>
《Web 推送通知》系列翻译 | 第七篇:推送事件 && 第八篇:显示一个通知
查看>>
你不知道的 Electron (一):神奇的 remote 模块
查看>>
华为资深架构师:Cloud Native架构一致性问题及解决方案
查看>>
AI还有什么不会的?机器人写稿技术应用
查看>>
iOS 中的 block 是如何持有对象的
查看>>
从业务变迁到研发犯难,微服务在Spring Cloud的实践之路
查看>>
Python 连接 MySQL 的几种姿势
查看>>