iOS--轮播图实现

- (void)viewDidLoad {
    [super viewDidLoad];
 
    /**
     *  轮播图
     *
     *  @return nil
     */
    //图片数组
    imageArr = @[@"scroll.png",@"record.png",@"state2.png"];
    //scrollview的宽和高
    scrollWidth = ScreenWidth - 20;
    scrollHeight = (homeViewHeight-5)*0.3;
    //设定scrollview的contentSize大小,如果contentSize的高大于scrollview的高就会出现上下拖动的现象,一般设成相等或为0
    scrollView.contentSize = CGSizeMake(scrollWidth*(self.imageArr.count+2), scrollHeight);
    //默认从第一页开始
    [scrollView setContentOffset:CGPointMake(0, 0)];
    [scrollView scrollRectToVisible:CGRectMake(scrollWidth, 0, scrollWidth, scrollHeight) animated:NO];
    scrollView.delegate = self;
    //pageControl的点的个数
    pageControl.numberOfPages = self.imageArr.count;
    //从第一页开始
    pageControl.currentPage = 0;
    //轮播
    [pageControl addTarget:self action:@selector(turnPage) forControlEvents:UIControlEventValueChanged];
    //添加图片
    for (int i = 0; i < imageArr.count; i ++) {
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(scrollWidth*i+scrollWidth, 0, scrollWidth, scrollHeight)];
        imageView.image = [UIImage imageNamed:imageArr[i]];
        imageView.userInteractionEnabled = YES;
        [scrollView addSubview:imageView];
    }
    //取最后一张图片放在第0页
    UIImageView *firstImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, scrollWidth, scrollHeight)];
    
    firstImageView.image = [UIImage imageNamed:[imageArr lastObject]];
    [scrollView addSubview:firstImageView];
    //取第一张图片放在最后一页
    UIImageView *lastImageView = [[UIImageView alloc] initWithFrame:CGRectMake(scrollWidth*(imageArr.count+1), 0, scrollWidth, scrollHeight)];
    lastImageView.image = [UIImage imageNamed:[self.imageArr firstObject]];
    [scrollView addSubview:lastImageView];
    
    //定时器 循环播放
    [self addTimer];
    
}

#pragma mark--------轮播图实现,UIPageControl控制自动轮播---
- (void)turnPage {
    NSInteger page = pageControl.currentPage; // 获取当前的page
    [scrollView scrollRectToVisible:CGRectMake(scrollWidth*(page+1),0,scrollWidth,scrollHeight) animated:NO]; // 触摸pagecontroller那个点点 往后翻一页 +1
}

- (void)runTimePage {
    NSInteger page = pageControl.currentPage; // 获取当前的page
    page++;
    page = page > (imageArr.count - 1) ? 0 : page ;
    pageControl.currentPage = page;
    [self turnPage];
}

- (void)addTimer {
    
    self.myTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(runTimePage) userInfo:nil repeats:YES];
}

#pragma mark---UIScrollView代理方法,保证可以手动滑动
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    //关闭定时器,避免与手动滑动冲突
    [self.myTimer invalidate];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    //当手动滑动结束后,开启定时器
    [self addTimer];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    
    CGFloat pagewidth = scrollWidth;
    NSInteger page = floor((scrollView.contentOffset.x - pagewidth/([imageArr count]+2))/pagewidth)+1;
    page --;  // 默认从第二页开始
    pageControl.currentPage = page;
    
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    
    CGFloat pagewidth = scrollWidth;
    NSInteger currentPage = floor((scrollView.contentOffset.x - pagewidth/ ([imageArr count]+2)) / pagewidth) + 1;
    if (currentPage==0)
    {
        [scrollView scrollRectToVisible:CGRectMake(scrollWidth * [imageArr count],0,scrollWidth,scrollHeight) animated:NO]; // 序号0 最后1页
    }
    else if (currentPage==([imageArr count]+1))
    {
        [scrollView scrollRectToVisible:CGRectMake(scrollWidth,0,scrollWidth,scrollHeight) animated:NO]; // 最后+1,循环第1页
    }
    
}
原文地址:https://www.cnblogs.com/zhangshan/p/5313134.html