网上已经有很多类似的文章了,最近看了一下别人写的Demo,然后就自己也写了一个类似的自动循环,原理 与网上的一样,该文中用了三个UIImageView控件循环显示
虽然只能看到三个,但scrollView中有五个UIImageView的位置,例如 3 1 2 3 1 只显示中间三个,剩下两个作为过渡来使用。 能基本满足项目需求 看代码
声明三个属性
@property (strong, nonatomic) UIScrollView * scrollView;
@property (strong, nonatomic) UIPageControl * pageControl;
@property (weak, nonatomic) NSTimer * timer; // 用来循环显示
在viewDidLoad方法中声明一个数组,里面用来放图片,这里用背景颜色来代替
// 这里只用背景颜色来代替, 可以直接用图片来代替颜色
NSArray * colors = @[[UIColor redColor],[UIColor greenColor],[UIColor blueColor]];
初始化scrollView和pageController 并设置相关属性 这里不再赘述,看循环添加imageView
for (int i = 0; i < colors.count; i++) {
CGRect rect = self.scrollView.frame;
// 从第二个位置开始显示
UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(rect.size.width * (i+1), 0, rect.size.width, HEIGHTFORSCROLLVIEW)];
imageView.backgroundColor = colors[i];
[self.scrollView addSubview:imageView];
// 如果想添加点击事件,可在此添加tap手势,此处不再赘述
imageView.userInteractionEnabled = YES;
}
然后再添加两个imageView
// 第一个位置
UIImageView * firstIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW)];
firstIV.backgroundColor = colors[colors.count-1];
[self.scrollView addSubview:firstIV];
// 最后一个位置
UIImageView * lastIV = [[UIImageView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH * (colors.count + 1), 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW)];
lastIV.backgroundColor = colors[0];
[self.scrollView addSubview:lastIV];
// 虽然只显示三个视图 但要给scrollView 留五个位置 第一个和最后一个不需要显示
[self.scrollView setContentSize:CGSizeMake(SCREEN_WIDTH * (colors.count + 2), HEIGHTFORSCROLLVIEW)];
[self.view addSubview:self.scrollView];
[self.view addSubview:self.pageControl];
第一次运行时显示第二个位置的imageView
[self.scrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW) animated:NO];
最后加个计时器 viewDidLoad方法中就这些
self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(goNextPage) userInfo:Nil repeats:YES];
看看scrollView的代理方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGPoint offset = scrollView.contentOffset;
NSInteger page = offset.x / scrollView.frame.size.width;
page--;
page = page > 3 ? 0 : page;
self.pageControl.currentPage = page;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
// 重新计时
[self.timer invalidate];
self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(goNextPage) userInfo:Nil repeats:YES];
CGFloat pageWidth = scrollView.frame.size.width;
CGPoint offset = scrollView.contentOffset;
NSLog(@"offset:%f",offset.x);
NSInteger currentPage = floor((self.scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1;
if (currentPage == 4) {
[self.scrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW) animated:NO];
}else if (currentPage == 0) {
[self.scrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH * 3, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW) animated:NO];
}
}
计时器的方法 自动循环
- (void)goNextPage
{
CGFloat pageWidth = self.scrollView.frame.size.width;
NSInteger currentPage = floor((self.scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1;
currentPage++;
if (currentPage == 4) {
[self.scrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW) animated:NO];
}else if (currentPage == 0) {
[self.scrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH * 3, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW) animated:NO];
}else {
[self.scrollView scrollRectToVisible:CGRectMake(currentPage * SCREEN_WIDTH, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW) animated:YES];
}
}
// 释放计时器
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.timer invalidate];
self.timer = Nil;
}
最后 给大家提供个下载地址 : ScrollViewAutomic