UIScrollView無縫銜接廣告輪播

思路

為了實現(xiàn)廣告輪播頁首尾無縫銜接舒裤,我們要在創(chuàng)建完原有圖片的基礎上在第一張圖片前面創(chuàng)建imageView顯示最后一張圖片,在最后一張圖片后面創(chuàng)建imageView顯示第一張圖片,這樣在最后一張往后滑觉吭,第一張往前滑腾供,然后再經(jīng)過計算修改scrollView的contentOffset,就可以實現(xiàn)輪播頁的 首尾無縫銜接鲜滩。

具體實現(xiàn)

1伴鳖,首先創(chuàng)建scrollView,這里使用懶加載進行創(chuàng)建

- (UIScrollView *)scrollView {
    if (!_scrollView) {
        UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
        //初始contentOffset為self.frame.size.width
        scrollView.contentOffset = CGPointMake(self.frame.size.width, 0);
        //contentSize的width為圖片的數(shù)量加2徙硅,因為頭尾各多加了一張圖片
        scrollView.contentSize = CGSizeMake(self.frame.size.width*(_images.count+2), self.frame.size.height);
        scrollView.pagingEnabled = YES;
        scrollView.showsHorizontalScrollIndicator = NO;
        scrollView.showsVerticalScrollIndicator = NO;
        scrollView.bounces = NO;
        scrollView.delegate = self;
        
        [self addSubview:scrollView];
        
        _scrollView = scrollView;
    }
    return _scrollView;
}

2榜聂,懶加載創(chuàng)建imageView

- (void)createImageViews {
    for (NSInteger i = 0; i < _images.count + 2; i++) {
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.frame.size.width*i, 0, self.frame.size.width, self.frame.size.height)];
        //創(chuàng)建self.images.count + 2個imageView,為了實現(xiàn)左右滑動無縫連接嗓蘑,除了正常的圖片之外须肆,在第一張之前加上最后一張匿乃,在最后一張后加上第一張
        if (i == 0) {
            imageView.image = _images[_images.count-1];
        } else if (i == _images.count + 1) {
            imageView.image = _images[0];
        } else {
            imageView.image = _images[i - 1];
        }
        [self.scrollView addSubview:imageView];
    }
}

3,懶加載創(chuàng)建pageControl

- (UIPageControl *)pageControl {
    if (!_pageControl) {
        UIPageControl *pageControl = [[UIPageControl alloc] init];
        
        pageControl.numberOfPages = self.images.count;
        
        self.currentPage = 0;
        
        pageControl.hidden = !self.isPageControlNeed;
        
        pageControl.currentPage = self.currentPage;
        
        CGSize pageControlSize = [pageControl sizeForNumberOfPages:self.images.count];
        
        pageControl.frame = CGRectMake((self.frame.size.width - pageControlSize.width)/2, self.frame.size.height - 50, pageControlSize.width, pageControlSize.height);
        
        [self addSubview:pageControl];
        
        _pageControl = pageControl;
        
    }
    return _pageControl;
}

4豌汇,懶加載創(chuàng)建定時器幢炸,為了防止滑動界面的時候定時器停止,把定時器的mode設置成NSRunLoopCommonModes

- (NSTimer *)timer {
    if (!_timer) {
        //創(chuàng)建定時器前先刪除拒贱,可以防止多次創(chuàng)建
        [_timer invalidate];
        //創(chuàng)建定時器
        NSTimer *timer = [NSTimer timerWithTimeInterval:_timeInterval target:self selector:@selector(imageScroll) userInfo:nil repeats:YES];
        //添加到當前RunLoop中宛徊,設置模式為NSRunLoopCommonModes,可以防止滑動界面的時候定時器停止
        [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
        _timer = timer;
    }
    return _timer;
}

5逻澳,設置定時器的滾動動畫,每次執(zhí)行當前頁面加一闸天,在block里修改contentOffSet,執(zhí)行動畫,然后判斷是否是最后一張圖片赡盘,如果是号枕,重設currentPage,contentOffset陨享。

//滾動動畫
- (void)imageScroll {
    self.currentPage++;
    //執(zhí)行動畫
    [UIView animateWithDuration:self.scrollAnimateDuration animations:^{
        self.scrollView.contentOffset = CGPointMake(self.frame.size.width*(_currentPage+1), 0);
    }];
    if (self.currentPage == self.images.count) {
        self.currentPage = 0;
        self.scrollView.contentOffset = CGPointMake(self.frame.size.width*(_currentPage+1), 0);
        ;
    }
    self.pageControl.currentPage = self.currentPage;
}

6葱淳,上面已經(jīng)設定好自動滾動的功能,下面我們要考慮手動滑動的邏輯判斷抛姑,首先我們要遵守UIScrollViewDelegate協(xié)議赞厕,然后實現(xiàn)其代理,在滑動結束后定硝,判斷當前坐標皿桑,然后修改currentPage,如果在最后一頁或者第一頁蔬啡,則修改contentOffset

#pragma mark - UIScrollViewDelegate
//設置代理輪動完成后觸發(fā)
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    NSInteger offSet = scrollView.contentOffset.x;
    //判斷是否為最后一頁
    if (offSet == self.frame.size.width*(self.images.count+1)) {
        offSet = self.frame.size.width;
        self.scrollView.contentOffset = CGPointMake(offSet, 0);
        self.currentPage = 0;
    }
  //判斷是否為第一頁
   else if (offSet == 0) {
        offSet = self.frame.size.width*self.images.count;
        self.scrollView.contentOffset = CGPointMake(offSet, 0);
        self.currentPage = self.images.count - 1;
    } 
  //其它情況
  else {
        self.scrollView.contentOffset = CGPointMake(offSet, 0);
        self.currentPage = offSet/self.frame.size.width - 1;
    }
    self.pageControl.currentPage = self.currentPage;
}

到這里為止一個無縫銜接的廣告滾動頁就完成了诲侮,有任何疑問請留言
Github:https://github.com/tinybird00/ZSXScrollAdView

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市箱蟆,隨后出現(xiàn)的幾起案子沟绪,更是在濱河造成了極大的恐慌,老刑警劉巖空猜,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绽慈,死亡現(xiàn)場離奇詭異,居然都是意外死亡辈毯,警方通過查閱死者的電腦和手機坝疼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谆沃,“玉大人钝凶,你說我怎么就攤上這事」鼙校” “怎么了腿椎?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵桌硫,是天一觀的道長夭咬。 經(jīng)常有香客問我啃炸,道長,這世上最難降的妖魔是什么卓舵? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任南用,我火速辦了婚禮,結果婚禮上掏湾,老公的妹妹穿的比我還像新娘裹虫。我一直安慰自己,他們只是感情好融击,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布筑公。 她就那樣靜靜地躺著,像睡著了一般尊浪。 火紅的嫁衣襯著肌膚如雪匣屡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天拇涤,我揣著相機與錄音捣作,去河邊找鬼。 笑死鹅士,一個胖子當著我的面吹牛券躁,可吹牛的內容都是我干的。 我是一名探鬼主播掉盅,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼也拜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了趾痘?” 一聲冷哼從身側響起慢哈,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扼脐,沒想到半個月后岸军,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡瓦侮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年艰赞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肚吏。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡方妖,死狀恐怖,靈堂內的尸體忽然破棺而出罚攀,到底是詐尸還是另有隱情党觅,我是刑警寧澤雌澄,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站杯瞻,受9級特大地震影響镐牺,放射性物質發(fā)生泄漏。R本人自食惡果不足惜魁莉,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一睬涧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旗唁,春花似錦畦浓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屎媳,卻和暖如春欧漱,著一層夾襖步出監(jiān)牢的瞬間储矩,已是汗流浹背丰涉。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工颜价, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晒来。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓钞诡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親湃崩。 傳聞我的和親對象是個殘疾皇子荧降,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容