iOS无限轮播banner广告页

关于无限轮播广告页,相信大家已经再熟悉不过了,今天给大家带来一个我自己写的SGAdvertScrollView;轻松搞定广告页显示和点击跳转功能,废话不多述直接贴代码:

GitHub地址: SGAdvertScrollView

原理:利用 scrollView 只创建三页内容展示(第一页left ,第二页center ,第三页right)默认显示第二页 center,然后向左或者右滑动结束后自动跳回第二页 center 页,更改 center 页显示的内容为第三页或者第一页内容来实现换页,具体看代码和源码:

SGAdvertScrollView.h文件:

#import <UIKit/UIKit.h>

@interface SGAdvertScrollView : UIView
/*!
 * @abstract                return instance
 * @param imagesArray       图片URL数组
 * @param timeInterval      自动轮播时间(秒) 默认为5秒
 * @param advertSelectBlock 点击图片回调block
 */
+ (instancetype)advertScrollViewFrame:(CGRect)frame imagesArray:(NSArray *)imagesArray timeInterval:(NSTimeInterval)timeInterval advertSelectBlock:(void(^)(int selectIndex))advertSelectBlock;
/*!
 * @abstract  stop timer
 */
- (void)stopTimer;
@end
</pre>
SGAdvertScrollView.m文件:
<pre>
#import "SGAdvertScrollView.h"
#define UIImageWithName(name) [UIImage imageNamed:name]
@interface SGAdvertScrollView()<UIScrollViewDelegate>{
    int _centerIndex;
    NSArray *_imageNameArray;
    NSTimeInterval _timeInterval;
}
@property (nonatomic ,strong) UIScrollView *adScrollView;
@property (nonatomic ,strong) UIImageView *leftImgView;
@property (nonatomic ,strong) UIImageView *centerImgView;
@property (nonatomic ,strong) UIImageView *rightImgView;
@property (nonatomic ,strong) NSTimer *timer;
@property (nonatomic ,strong) UIPageControl *pageControl;
@property (nonatomic ,copy) void (^advertClickBlock) (int selectIndex);
@end
@implementation SGAdvertScrollView
+ (instancetype)advertScrollViewFrame:(CGRect)frame imagesArray:(NSArray *)imagesArray timeInterval:(NSTimeInterval)timeInterval advertSelectBlock:(void(^)(int selectIndex))advertSelectBlock{
    return [[self alloc]initWithFrame:frame imagesArray:imagesArray timeInterval:timeInterval advertSelectBlock:advertSelectBlock];
}
-(instancetype)initWithFrame:(CGRect)frame imagesArray:(NSArray *)imagesArray timeInterval:(NSTimeInterval)timeInterval advertSelectBlock:(void(^)(int selectIndex))advertSelectBlock{
    self = [super initWithFrame:frame];
    if (self) {
        _imageNameArray = [imagesArray copy];
        self.advertClickBlock = advertSelectBlock;
        _timeInterval = timeInterval;
        if (_timeInterval == 0) {
            _timeInterval = 5;
        }
        [self setSubviews];
        [self startTimer];
    }
    return self;
}
#pragma mark -----lazy
- (UIScrollView *)adScrollView{
    if (!_adScrollView) {
        _adScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds))];
        _adScrollView.showsVerticalScrollIndicator = NO;
        _adScrollView.showsHorizontalScrollIndicator = NO;
        _adScrollView.pagingEnabled = YES;
        _adScrollView.backgroundColor = [UIColor whiteColor];
        _adScrollView.contentSize = CGSizeMake(3 * CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds));
        _adScrollView.contentOffset = CGPointMake(CGRectGetWidth(self.bounds), 0);
        _adScrollView.delegate = self;
        _adScrollView.bounces = NO;
        UITapGestureRecognizer *panGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(jumpToAdvertDetail)];
        [_adScrollView addGestureRecognizer:panGesture];
        [self addSubview:_adScrollView];
    }
    return _adScrollView;
}
- (UIImageView *)leftImgView{
    if (!_leftImgView) {
        _leftImgView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds))];
        [self.adScrollView addSubview:_leftImgView];
    }
    return _leftImgView;
}
- (UIImageView *)centerImgView{
    if (!_centerImgView) {
        _centerImgView = [[UIImageView alloc]initWithFrame:CGRectMake(CGRectGetWidth(self.bounds), 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds))];
        [self.adScrollView addSubview:_centerImgView];
    }
    return _centerImgView;
}
- (UIImageView *)rightImgView{
    if (!_rightImgView) {
        _rightImgView = [[UIImageView alloc]initWithFrame:CGRectMake(2 * CGRectGetWidth(self.bounds), 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds))];
        [self.adScrollView addSubview:_rightImgView];
    }
    return _rightImgView;
}
- (UIPageControl *)pageControl{
    if (!_pageControl) {
        _pageControl = [[UIPageControl alloc]init];
        CGSize size = [_pageControl sizeForNumberOfPages:_imageNameArray.count];
        _pageControl.frame = CGRectMake((CGRectGetWidth(self.bounds) - size.width) / 2, CGRectGetHeight(self.bounds) - size.height, size.width, size.height);
        _pageControl.center = CGPointMake(self.adScrollView.center.x, _pageControl.center.y);
        _pageControl.numberOfPages = _imageNameArray.count;
        _pageControl.hidesForSinglePage = YES;
        _pageControl.pageIndicatorTintColor = [UIColor grayColor];
        _pageControl.currentPageIndicatorTintColor = [UIColor yellowColor];
        [self insertSubview:_pageControl aboveSubview:self.adScrollView];
    }
    return _pageControl;
}
#pragma mark -----operation methods
- (void)setSubviews{
    if (_centerIndex < 0) {
        _centerIndex = (int)_imageNameArray.count - 1;
    }
    if (_centerIndex >= _imageNameArray.count) {
        _centerIndex = 0;
    }
    int leftIndex = _centerIndex - 1;
    if (leftIndex < 0){
        leftIndex = (int)_imageNameArray.count - 1;
    }
    int rightIndex = _centerIndex + 1;
    if (rightIndex >= _imageNameArray.count) {
        rightIndex = 0;
    }
    NSLog(@"leftIndex:%d;_centerIndex:%d;rightIndex:%d",leftIndex,_centerIndex,rightIndex);
    if ((leftIndex >= _imageNameArray.count || _centerIndex >= _imageNameArray.count || rightIndex >= _imageNameArray.count)) {
        NSLog(@"数组越界");
        return;
    }
    
    NSString *leftImgName = [_imageNameArray objectAtIndex:leftIndex];
    NSString *centerImgName = [_imageNameArray objectAtIndex:_centerIndex];
    NSString *rightImgName = [_imageNameArray objectAtIndex:rightIndex];
    
    //MARK:local images
    self.leftImgView.image = UIImageWithName(leftImgName);
    self.centerImgView.image = UIImageWithName(centerImgName);
    self.rightImgView.image = UIImageWithName(rightImgName);
    
    //MARK:url images
    /*
    [self.leftImgView sd_setImageWithURL:[NSURL URLWithString:leftImgName] placeholderImage:UIImageWithName(leftImgName)];
    [self.centerImgView sd_setImageWithURL:[NSURL URLWithString:centerImgName] placeholderImage:UIImageWithName(centerImgName)];
    [self.rightImgView sd_setImageWithURL:[NSURL URLWithString:rightImgName] placeholderImage:UIImageWithName(rightImgName)];
    */
    
    self.pageControl.currentPage = _centerIndex;
}
- (void)jumpToAdvertDetail{
    if (self.advertClickBlock) {
        self.advertClickBlock(_centerIndex);
    }
}
#pragma mark -----NSTimer
- (void)startTimer{
    [self stopTimer];
    _timer = [NSTimer scheduledTimerWithTimeInterval:_timeInterval target:self selector:@selector(timerChanged) userInfo:nil repeats:YES];
}
- (void)timerChanged{
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        [self.adScrollView scrollRectToVisible:CGRectMake(2 * CGRectGetWidth(self.bounds), 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds)) animated:NO];
    } completion:^(BOOL finished) {
        [self.adScrollView scrollRectToVisible:CGRectMake(CGRectGetWidth(self.bounds), 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds)) animated:NO];
        _centerIndex++;
        [self setSubviews];
    }];
}
- (void)stopTimer{
    if (_timer) {
        [_timer invalidate];
        _timer = nil;
    }
}
#pragma mark -----UIScrollViewDelegate
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
    [self stopTimer];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    [self startTimer];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    CGFloat offsetX = scrollView.contentOffset.x;
    if (offsetX != CGRectGetWidth(self.bounds)) {
        [scrollView scrollRectToVisible:CGRectMake(CGRectGetWidth(self.bounds), 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds)) animated:NO];
        if (offsetX <= CGRectGetWidth(self.bounds)) {
            _centerIndex--;
        }else if (offsetX >= CGRectGetWidth(self.bounds) * 2){
            _centerIndex++;
        }
        [self setSubviews];
    }
}
@end
</pre>

注意:需要自己导入 SDWebImage并且改为网络地址:
SGAdvertScrollView.m
网络图片格式如下:注释掉本地图片的代码,打开网络图片代码,还有使用我的 demo加载网络图片不出来的检查一下 info.plist 文件,看看有没有允许访问网络(兼容 https)
<pre>
  //MARK:local images
//    self.leftImgView.image = UIImageWithName(leftImgName);
//    self.centerImgView.image = UIImageWithName(centerImgName);
//    self.rightImgView.image = UIImageWithName(rightImgName);
    
    //MARK:url images
    
    [self.leftImgView sd_setImageWithURL:[NSURL URLWithString:leftImgName] placeholderImage:UIImageWithName(leftImgName)];
    [self.centerImgView sd_setImageWithURL:[NSURL URLWithString:centerImgName] placeholderImage:UIImageWithName(centerImgName)];
    [self.rightImgView sd_setImageWithURL:[NSURL URLWithString:rightImgName] placeholderImage:UIImageWithName(rightImgName)];

喜欢的朋友可以给我点赞哦...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,660评论 4 59
  • 在做销售的时候,遇到前台阻碍,该如何绕过前台? 其实,我们做任何事情的套路是一样的,做销售,就是跟人打交道,怎么打...
    星空仰望者阅读 2,035评论 0 0
  • 太阳说,有春天的日子里,就有三叶草,就有绽放。 一 对于这片世界,三叶草是位拓荒者,一...
    落水有声阅读 429评论 1 5
  • 青春年少的姑娘 总是喜欢阳光明媚 闲适的风吹过萌动的心 总是容易产生想象的情愫 而阴雨连连 却是容易破坏这气氛的小...
    空酒阅读 2,495评论 6 7