iOS無限輪播banner廣告頁

關(guān)于無限輪播廣告頁,相信大家已經(jīng)再熟悉不過了,今天給大家?guī)硪粋€我自己寫的SGAdvertScrollView;輕松搞定廣告頁顯示和點擊跳轉(zhuǎn)功能,廢話不多述直接貼代碼:

GitHub地址: SGAdvertScrollView

原理:利用 scrollView 只創(chuàng)建三頁內(nèi)容展示(第一頁left ,第二頁center ,第三頁right)默認(rèn)顯示第二頁 center,然后向左或者右滑動結(jié)束后自動跳回第二頁 center 頁,更改 center 頁顯示的內(nèi)容為第三頁或者第一頁內(nèi)容來實現(xiàn)換頁,具體看代碼和源碼:

SGAdvertScrollView.h文件:

#import <UIKit/UIKit.h>

@interface SGAdvertScrollView : UIView
/*!
 * @abstract                return instance
 * @param imagesArray       圖片URL數(shù)組
 * @param timeInterval      自動輪播時間(秒) 默認(rèn)為5秒
 * @param advertSelectBlock 點擊圖片回調(diào)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(@"數(shù)組越界");
        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>

注意:需要自己導(dǎo)入 SDWebImage并且改為網(wǎng)絡(luò)地址:
SGAdvertScrollView.m
網(wǎng)絡(luò)圖片格式如下:注釋掉本地圖片的代碼,打開網(wǎng)絡(luò)圖片代碼,還有使用我的 demo加載網(wǎng)絡(luò)圖片不出來的檢查一下 info.plist 文件,看看有沒有允許訪問網(wǎng)絡(luò)(兼容 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)];

喜歡的朋友可以給我點贊哦...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市虎眨,隨后出現(xiàn)的幾起案子绍坝,更是在濱河造成了極大的恐慌表悬,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件和屎,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逢倍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來景图,“玉大人较雕,你說我怎么就攤上這事≈勘遥” “怎么了亮蒋?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妆毕。 經(jīng)常有香客問我慎玖,道長,這世上最難降的妖魔是什么设塔? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任凄吏,我火速辦了婚禮,結(jié)果婚禮上闰蛔,老公的妹妹穿的比我還像新娘痕钢。我一直安慰自己,他們只是感情好序六,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布任连。 她就那樣靜靜地躺著,像睡著了一般例诀。 火紅的嫁衣襯著肌膚如雪随抠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天繁涂,我揣著相機(jī)與錄音拱她,去河邊找鬼。 笑死扔罪,一個胖子當(dāng)著我的面吹牛秉沼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼唬复,長吁一口氣:“原來是場噩夢啊……” “哼矗积!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敞咧,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤棘捣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后休建,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乍恐,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年丰包,在試婚紗的時候發(fā)現(xiàn)自己被綠了禁熏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壤巷。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡邑彪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胧华,到底是詐尸還是另有隱情寄症,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布矩动,位于F島的核電站有巧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悲没。R本人自食惡果不足惜篮迎,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望示姿。 院中可真熱鬧甜橱,春花似錦、人聲如沸栈戳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽子檀。三九已至镊掖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間褂痰,已是汗流浹背亩进。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留缩歪,地道東北人归薛。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親苟翻。 傳聞我的和親對象是個殘疾皇子韵卤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,517評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件崇猫、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評論 4 62
  • 在做銷售的時候沈条,遇到前臺阻礙,該如何繞過前臺诅炉? 其實蜡歹,我們做任何事情的套路是一樣的,做銷售涕烧,就是跟人打交道月而,怎么打...
    星空仰望者閱讀 2,091評論 0 0
  • 太陽說,有春天的日子里议纯,就有三葉草父款,就有綻放。 一 對于這片世界瞻凤,三葉草是位拓荒者憨攒,一...
    落水有聲閱讀 453評論 1 5
  • 青春年少的姑娘 總是喜歡陽光明媚 閑適的風(fēng)吹過萌動的心 總是容易產(chǎn)生想象的情愫 而陰雨連連 卻是容易破壞這氣氛的小...
    空酒閱讀 2,531評論 6 7