如今非常多应用里面多多少少都用到了循环滚动,要么是图片、要么是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实现循环滚动。看下图:
CGFloat pageWidth = scrollView.frame.size.width;int currentPage = floor((scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1;
floor计算 的出来是0、1、2,能够利用是0还是2进行推断用户是向左滑动,还是向右滑动。从而实现循环滚动,后台在配合数组的使用。就能够实现图片等循环滚动啦!