iOS学习笔记-043.UIScrollView分页加强——连续滚动

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

三、图示

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值