iOS图片的循环滑动

iOS图片的循环滑动

使用计时器,scrollView,pageControl完成图片的自动,手动循环滑动

该代码块中用到的图片直接使用的第三方SDWebImage异步加载网络图片,如有需要,可直接换成本地图片

.h文件
@interface MyScrollViewOnView : UIView<UIScrollViewDelegate>
{
    UIScrollView *_scrollView;

    UIPageControl *_pageControl;

    NSTimer *_timer;

}
@property (nonatomic, strong) NSArray *imgArr;

.m文件
#import "MyScrollViewOnView.h"
@implementation MyScrollViewOnView
- (void)_initView
{
    //初始化scrollView
    _scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
    _scrollView.delegate = self;
    _scrollView.pagingEnabled = YES;
    _scrollView.showsHorizontalScrollIndicator = NO;
    _scrollView.showsVerticalScrollIndicator = NO;

    //创建scrollView上的imageView
    UIImageView *firstImgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, _scrollView.width, _scrollView.height)];
    //加载url图片,将第一个imgView显示最后一张图片
      /*
     如果是本地图片则使用
     firstImgView.image = [UIImage imageNamed:@"001.png"];
     */
    [firstImgView sd_setImageWithURL:[NSURL URLWithString:[self.imgArr lastObject]]];
    [_scrollView addSubview:firstImgView];

    //创建数组中的图片用imgView显示出来
    for (int i = 0; i < self.imgArr.count; i++) {
        UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(_scrollView.width * (i + 1), 0, _scrollView.width, _scrollView.height)];
        [imgView sd_setImageWithURL:[NSURL URLWithString:self.imgArr[i]]];
        [_scrollView addSubview:imgView];
    }

    //创建最后一个imgView,显示的是第一张图片
    UIImageView *lastImgView = [[UIImageView alloc] initWithFrame:CGRectMake(_scrollView.width * (self.imgArr.count + 1), 0, _scrollView.width, _scrollView.height)];
    [lastImgView sd_setImageWithURL:[NSURL URLWithString:self.imgArr[0]]];
    [_scrollView addSubview:lastImgView];

    //设置内容视图
    _scrollView.contentSize = CGSizeMake(_scrollView.width * (self.imgArr.count + 2), _scrollView.height);
    [self addSubview:_scrollView];

    //从第2个imgView开始,但是显示的图片是第一张
    [_scrollView scrollRectToVisible:CGRectMake(_scrollView.width, 0, _scrollView.width, _scrollView.height) animated:NO];

    //设置pageControl
    _pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, _scrollView.height - 20, _scrollView.width, 20)];
    _pageControl.userInteractionEnabled = NO;
    _pageControl.numberOfPages = self.imgArr.count;
    _pageControl.currentPage = 0;
    //    _pageControl.backgroundColor = [UIColor redColor];
    [self addSubview:_pageControl];

    //设置计时器
    _timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];


}

- (void)timerAction:(NSTimer *)timer
{

    [_scrollView setContentOffset:CGPointMake(_scrollView.contentOffset.x + _scrollView.width, _scrollView.contentOffset.y) animated:YES];
    //计算出当前的页数
    NSInteger currentPage = floor((_scrollView.contentOffset.x - _scrollView.width / 2) / _scrollView.width) + 1;
    _pageControl.currentPage = currentPage;
    if (currentPage == self.imgArr.count) {
        currentPage = 0;
    }

}



- (void)setImgArr:(NSArray *)imgArr
{
    if (_imgArr != imgArr) {
        _imgArr = imgArr;
        [self _initView];
    }
}

#pragma mark-----UIScrollViewDelegate
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
    [self scrollViewDidEndDecelerating:_scrollView];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
//    isDeceleration = NO;
    //计算出当前的页数
    NSInteger currentPage = floor((_scrollView.contentOffset.x - _scrollView.width / 2) / _scrollView.width) + 1;

    if (currentPage == 0) {
        //滑到第一个imgView,显示的是最后一张图片(往右划的情况)
        [_scrollView scrollRectToVisible:CGRectMake(_scrollView.width * self.imgArr.count, 0, _scrollView.width, _scrollView.height) animated:NO];
        _pageControl.currentPage = self.imgArr.count - 1;
        NSLog(@"显示的是最后一张图片,倒数第二个imgView");
        return;
    }else if (currentPage == self.imgArr.count + 1){
        //滑到了最后一张,但是显示的是第一张图片(往左划的情况)
        [_scrollView scrollRectToVisible:CGRectMake(_scrollView.width, 0, _scrollView.width, _scrollView.height) animated:NO];
        _pageControl.currentPage = 0;
        NSLog(@"显示的是第一张图片,第二个imgView");
        return;
    }
    _pageControl.currentPage = currentPage - 1;

//    NSLog(@"current page-------%ld", _pageControl.currentPage);
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{

    [_timer invalidate];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{

    _timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];

}

如若代码中出现错误,欢迎指出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值