iOS實(shí)現(xiàn)自動循環(huán)播放的banner實(shí)例詳解
前言
對于banner輪播圖,相信大家都會經(jīng)常用到。自動循環(huán)播放的banner是很常見的UI組件。如何實(shí)現(xiàn)呢?下面就來給大家詳細(xì)介紹下,話不多說了,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
1.實(shí)現(xiàn)思路
1.橫向滾動的banner。
- UIScrollViw+UIImageView.
- UICollectionView+UICollectionViewCell.
- 前者需要自己做重用UIImageView,后者可以直接重用UICollectionViewCell。如果前者沒有做重用,多占用內(nèi)存。
2.自動循環(huán)播放banner。
- 可以使用計(jì)時(shí)器觸發(fā)循環(huán)播放.
- 拖動或手動滑動banner時(shí),停止自動循環(huán)播放banner。手勢停止后,開啟自動循環(huán)播放banner。
3.特殊banner位的處理。
- 處于第1個或最后1個時(shí),為保證橫向自動滑動效果流暢性,不跳動,需要特殊處理下。
- 在生成banner時(shí),第1個前面插入最后1個banner。最后1個banner后面插入第1個banner。當(dāng)滑動到最后1個banner時(shí),重置于第2個banner位。
2.本文采用第二種:UICollectionView+UICollectionViewCell
關(guān)鍵代碼實(shí)現(xiàn)
2.1生成banner的特殊處理
- (void)setBannerList:(NSArray<KBannerItem *> *)bannerList { if (bannerList.count > 1) { NSMutableArray *itemList = [NSMutableArray arrayWithArray:bannerList]; [itemList insertObject:bannerList.lastObject atIndex:0]; [itemList addObject:bannerList.firstObject]; _bannerList = itemList; }else{ _bannerList = bannerList; } if (self.bannerList.count > 1) { self.bannerPageControl.numberOfPages = self.bannerList.count - 2; }else{ self.bannerPageControl.numberOfPages = 0; } self.noBannerImageView.hidden = self.bannerList.count > 0; self.bannerPageControl.currentPage = 0; [self.collectionView reloadData]; self.collectionView.contentOffset = CGPointMake(CGRectGetWidth(self.collectionView.frame), 0); }
2.2 banner自動循環(huán)播放觸發(fā)的事件
- (void)handleBannerChangeEvent:(id)sender { if (_bannerPageControl.numberOfPages <= 1) { return; } NSInteger page = _bannerPageControl.currentPage + 1; [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:page + 1 inSection:0] atScrollPosition:UICollectionViewScrollPositionRight animated:YES]; }
2.3開啟自動播放或關(guān)閉自動播放bannner。
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { self.countTimer.isOpen = NO; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { self.countTimer.isOpen = YES; }
2.4.滑動時(shí)的特殊處理。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (_bannerList.count <=1) { return; } CGFloat width = CGRectGetWidth(scrollView.frame); NSInteger currentPage = scrollView.contentOffset.x / width; if (currentPage == 0) { if (scrollView.contentOffset.x < 0) { [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:_bannerList.count - 2 inSection:0] atScrollPosition:UICollectionViewScrollPositionRight animated:NO]; self.bannerPageControl.currentPage = _bannerList.count - 2; }else{ [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0] atScrollPosition:UICollectionViewScrollPositionRight animated:NO]; self.bannerPageControl.currentPage = 0; } }else if (currentPage == _bannerList.count - 1) { self.bannerPageControl.currentPage = 0; [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0] atScrollPosition:UICollectionViewScrollPositionRight animated:NO]; }else{ self.bannerPageControl.currentPage = currentPage - 1; } }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
iOS推送增加右側(cè)顯示圖Service Extension
這篇文章主要為大家介紹了iOS推送增加右側(cè)顯示圖Service Extension,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10ios 流媒體播放器實(shí)現(xiàn)流程及FreeStreamer的使用的示例
本篇文章主要介紹了ios 流媒體播放器實(shí)現(xiàn)流程及FreeStreamer的使用的示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-01-01iOS使用UIScorllView實(shí)現(xiàn)兩指縮放功能
兩指縮放功能不僅可以用UIPinchGestureRecognizer手勢來實(shí)現(xiàn),還能用UIScorllView來實(shí)現(xiàn),UIScrollView可以輕松的實(shí)現(xiàn)最大與最小縮放值,以及滾動的效果,效果非常棒,具體實(shí)例代碼大家參考下本文吧2017-03-03IOS開發(fā)之JSON轉(zhuǎn)PLIST實(shí)例詳解
這篇文章主要介紹了IOS開發(fā)之JSON轉(zhuǎn)PLIST實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11iOS簡單易用的GCD計(jì)時(shí)器的實(shí)現(xiàn)原理
在日常開發(fā)中總會碰到需要計(jì)時(shí)器的功能,常見的定時(shí)器有NSTimer、GCD、CADisplayLink。網(wǎng)上也有很多的教程介紹三者的區(qū)別,今天主要講的是GCD這種方式使用以及封裝。感興趣的小伙伴們可以參考一下2018-11-11