UIScrollView分页加强——连续滚动
一、连续滚动的原理
原理其实很简单:如上,在开始位置加入末尾的图片,末尾加上开始的图片。然后我们根据页码来判断,如果当前的数组的角标处于’0’,说明用户现在要移动到最后一张图片,那么我们在所有对应的参数更改为最后一张的,如果处于最大值,那么说明现在用户需要的是第一张,那么我们把数据更改为第一张得数据。而给用户显示的总数其实是 红框里面的。数组的个数比显示的个数大2。
如下:
// 不考虑添加图片 0 1 2 3 4
// 添加图片之后 "4" 0 1 2 3 4 "0"
// 实际的数组坐标 0-5 1 2 3 4 5 6-1
二、代码演示
//
// ViewController.m
// 03_UIView34_UIScrollView连续分页
//
// Created by 杞文明 on 16/2/25.
// Copyright © 2016年 杞文明. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@property(weak,nonatomic)UIScrollView *scrollView;
@property(weak,nonatomic)UIPageControl *pageControl;
// 图片的总数
#define kImageCount 5
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建滚动视图 -------------------------------
UIScrollView *scroll = [[UIScrollView alloc]initWithFrame:self.view.bounds];
[self.view addSubview:scroll];
self.scrollView = scroll;
//2.创建图像数组 -------------------------------
NSMutableArray *imageArray = [NSMutableArray arrayWithCapacity:kImageCount+2];
for (NSInteger i=1; i<=kImageCount; i++) {
//1)创建图片名称
NSString *imageName = [NSString stringWithFormat:@"%ld.jpg",i];
//2)创建图像
UIImage *image = [UIImage imageNamed:imageName];
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
//3)添加到数组中
[imageArray addObject:imageView];
}
//4)重新创建最后一张图片图片添加到数组的第0个位置
UIImage *imageLast = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",kImageCount]];
UIImageView *lastImageView = [[UIImageView alloc]initWithImage:imageLast];
[imageArray insertObject:lastImageView atIndex:0];
//5)重新创建第一张图片插入到最后的位置
UIImage *imageFrist = [UIImage imageNamed:@"1.jpg"];
UIImageView *firstImageView = [[UIImageView alloc]initWithImage:imageFrist];
[imageArray insertObject:firstImageView atIndex:kImageCount+1];
//3.给滚动视图添加图像数组 -------------------------------
CGFloat width = scroll.bounds.size.width;
[imageArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
//1)获取到UIImageView对象
UIImageView *imageView = obj;
//2)设置对应的图片位置
[imageView setFrame:CGRectMake(idx*width, 0, width, scroll.bounds.size.height)];
//3)添加到scrollview中
[scroll addSubview:imageView];
}];
//4.设置滚动属性 -------------------------------
//1)允许分页
[scroll setPagingEnabled:YES];
//2)关闭弹簧效果
[scroll setBounces:NO];
//3)关闭水平滚动条
[scroll setShowsHorizontalScrollIndicator:NO];
//4)设置滚动区域大小
[scroll setContentSize:CGSizeMake(width*(kImageCount+2), scroll.bounds.size.height)];
//5)设置显示第一一张图片
[scroll setContentOffset:CGPointMake(width, 0)];
//6)设置代理
[scroll setDelegate:self];
//5.分页控件设置 -------------------------------
//1)创建分页控件
UIPageControl *pageControl = [[UIPageControl alloc]init];
//2)根据指定的页数,返回分页的适当大小
CGSize size = [pageControl sizeForNumberOfPages:kImageCount];
[pageControl setFrame:CGRectMake(0,0, size.width, size.height)];
//3)设置分页控件的位置
[pageControl setCenter:CGPointMake(width/2, 600)];
//4)设置分页控件的页数
[pageControl setNumberOfPages:kImageCount];
[pageControl setCurrentPage:0];
//5)设置分页控件的指示颜色
[pageControl setCurrentPageIndicatorTintColor:[UIColor redColor]];
[pageControl setPageIndicatorTintColor:[UIColor blueColor]];
//6)添加分页控件的添加方法
[pageControl addTarget:self action:@selector(pageChanged:) forControlEvents:UIControlEventValueChanged];
//7)把分页控件添加到视图中
self.pageControl = pageControl;
[self.view addSubview:pageControl];
}
#pragma -mark 减速完成,处理分页的方法
-(void)scrollViewDidEndDecelerating:(nonnull UIScrollView *)scrollView{
//计算出页码
NSInteger pageNo = scrollView.contentOffset.x/scrollView.bounds.size.width;
if(pageNo==0 || pageNo == kImageCount+1){
if (pageNo==0) {//如果是第0页的话,那么把它更改为 最后一个图片
pageNo = kImageCount;
}else{//最后一个的话,设置为1
pageNo = 1;
}
//不要开启动画
[scrollView setContentOffset:CGPointMake(scrollView.bounds.size.width*pageNo, 0)];
}
//设置分页控件的页码
[self.pageControl setCurrentPage:pageNo - 1];
}
#pragma -mark 分页控件值改变事件
-(void)pageChanged:(UIPageControl*)pageControl{
//计算位置的偏移
CGFloat offsetx = (pageControl.currentPage+1)*self.scrollView.bounds.size.width;
[self.scrollView setContentOffset:CGPointMake(offsetx, 0)];
}
@end