UIScrollView无限广告轮播图

1.广告轮播图,在不同的app上都能看到这样的效果,我用两种方法实现了,给大家说下思路,第一种是:如果有5张图片,5-1-2-3-4-5-1需要7个imageview来实现,添加UIPageContrl,NSTimer等这些基础的东西,大家自己实现,这个这里只是讲下具体代码

- (void)initWithUIScrollView{
    _scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, AppRealValue(180))];
    _scrollView.contentSize = CGSizeMake(KScreenWidth * _imageArray.count, 0);
    _scrollView.pagingEnabled = YES;
    _scrollView.bounces = NO;
    _scrollView.backgroundColor = [UIColor purpleColor];
    self.scrollView.showsHorizontalScrollIndicator = NO;
    self.scrollView.delegate = self;
    self.scrollView.contentOffset = CGPointMake(KScreenWidth, 0);
    for (int i = 0; i < _imageArray.count; i++) {
        UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(KScreenWidth * i, 0, KScreenWidth, AppRealValue(180))];
        imageView.image = [UIImage imageNamed:_imageArray[i]];
        [self.scrollView addSubview:imageView];
    }
    [self.view addSubview:self.scrollView];
}

UIScrollView的代理方法来实现图片滑动

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    NSInteger page = self.scrollView.contentOffset.x / KScreenWidth;
    if (page == 0) {
        [self.scrollView setContentOffset:CGPointMake(KScreenWidth * ([_imageArray count] - 2), 0) animated:NO];
        self.pageControl.currentPage = [self.imageArray count] - 3;
    }else if (page == [self.imageArray count] -1){
        [self.scrollView setContentOffset:CGPointMake(KScreenWidth, 0) animated:NO];
        self.pageControl.currentPage = 0;
    }else{
        self.pageControl.currentPage = page - 1;
    }
}

定时器自动显示不同图片

- (void)nextImage{
    NSInteger page = self.pageControl.currentPage;
    if (page == [self.imageArray count] - 3) {
        self.pageControl.currentPage = 0;
        [self.scrollView setContentOffset:CGPointMake(KScreenWidth, 0) animated:NO];
    }else{
        self.pageControl.currentPage = page + 1;
        [self.scrollView setContentOffset:CGPointMake(KScreenWidth * (self.pageControl.currentPage + 1), 0) animated:NO];
    }
}

上面这种方法,可能在图片比较多的时候,没有下面这种方法好,而且动画也不如下面这种
2.第二种方法是创建3个ImageView
设置ImageView

- (void)setUpImageView{
    self.leftImage = [[UIImageView alloc]init];
    self.leftImage.image = [UIImage imageNamed:[_arrayImage lastObject]];
    [self.scrollView addSubview:self.leftImage];
    
    self.centerImage = [[UIImageView alloc]init];
    self.centerImage.image = [UIImage imageNamed:_arrayImage[0]];
    [self.scrollView addSubview:self.centerImage];
    
    self.rightImage = [[UIImageView alloc]init];
    self.rightImage.image = [UIImage imageNamed:_arrayImage[1]];
    [self.scrollView addSubview:self.rightImage];
}

注意:scrollView的contentSize的设置

self.scrollView.contentSize = CGSizeMake(3 * KScreenWidth, 0);
[self.scrollView setContentOffset:CGPointMake(KScreenWidth, 0) animated:NO];

设置刷新图片

- (void)reloadImage{
    NSInteger page = self.scrollView.contentOffset.x / KScreenWidth;
    if (page == 0)
    {
        _currentPage = ((_currentPage - 1 + _arrayImage.count) % [_arrayImage count]);
        _leftImage.image = [UIImage imageNamed:_arrayImage[(_currentPage - 1 + _arrayImage.count) % _arrayImage.count]];
        _centerImage.image = [UIImage imageNamed:_arrayImage[_currentPage]];
        _rightImage.image = [UIImage imageNamed:_arrayImage[(_currentPage + 1 + _arrayImage.count ) % _arrayImage.count]];
    }else if (page == 2){
        _currentPage = (_currentPage + 1) % _arrayImage.count;
        _leftImage.image = [UIImage imageNamed:_arrayImage[(_currentPage - 1 ) % _arrayImage.count]];
        _centerImage.image = [UIImage imageNamed:_arrayImage[_currentPage]];
        _rightImage.image = [UIImage imageNamed:_arrayImage[(_currentPage + 1 ) % _arrayImage.count]];
    }
    [self.scrollView setContentOffset:CGPointMake(KScreenWidth, 0) animated:NO];
}

UIScrollView的代理方法与定时器的图片动画

- (void)nextImage{
    [UIView animateWithDuration:1.0 animations:^{
        _scrollView.contentOffset = CGPointMake(KScreenWidth * 2, 0);
    } completion:^(BOOL finished) {
        [self reloadImage];
    }];
    NSInteger page = self.pageControl.currentPage;
    if (page == _arrayImage.count - 1) {
        self.pageControl.currentPage = 0;
    }else{
    self.pageControl.currentPage = _currentPage + 1;
    }
}
#pragma mark ----UIScrollViewDelegate代理方法(停止加速时调用)
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    [self reloadImage];
    self.scrollView.contentOffset = CGPointMake(KScreenWidth,0);
    self.pageControl.currentPage = _currentPage;
    NSLog(@"停止了加速,停在第%ld页",self.pageControl.currentPage + 1);
}

全部的代码都已经贴出来了,爸妈再也不用担心我不会使用图片轮播了,谢谢大家!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,758评论 4 61
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,729评论 25 709
  • 放下暂时的工作,寥寥草草写了请假条。收拾好行李,带上一件长裙和一个碎花坎肩,因为她是怕冷的。她记得一定带上miro...
    卓倪阅读 1,454评论 4 0
  • 我们都想当恋爱中的小女人,都向往怦然心动就可以厮守一生的爱情,无一例外。 01 刘阿卡认为她的童年给过她太多...
    空持罗带阅读 3,273评论 2 2
  • 又是一年开学季,托着箱子挽着父母的新生,拿着洗漱篮刚洗澡回来的学姐,抱着篮球三五成群的学长,甜蜜的拉着小手的情侣,...
    盛夏桐悦阅读 3,339评论 1 2

友情链接更多精彩内容