iOS實現(xiàn)自動循環(huán)播放的banner實例詳解
前言
對于banner輪播圖,相信大家都會經(jīng)常用到。自動循環(huán)播放的banner是很常見的UI組件。如何實現(xiàn)呢?下面就來給大家詳細介紹下,話不多說了,下面來一起學習學習吧。
1.實現(xiàn)思路
1.橫向滾動的banner。
- UIScrollViw+UIImageView.
- UICollectionView+UICollectionViewCell.
- 前者需要自己做重用UIImageView,后者可以直接重用UICollectionViewCell。如果前者沒有做重用,多占用內(nèi)存。
2.自動循環(huán)播放banner。
- 可以使用計時器觸發(fā)循環(huán)播放.
- 拖動或手動滑動banner時,停止自動循環(huán)播放banner。手勢停止后,開啟自動循環(huán)播放banner。
3.特殊banner位的處理。
- 處于第1個或最后1個時,為保證橫向自動滑動效果流暢性,不跳動,需要特殊處理下。
- 在生成banner時,第1個前面插入最后1個banner。最后1個banner后面插入第1個banner。當滑動到最后1個banner時,重置于第2個banner位。
2.本文采用第二種:UICollectionView+UICollectionViewCell
關鍵代碼實現(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開啟自動播放或關閉自動播放bannner。
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
self.countTimer.isOpen = NO;
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView
willDecelerate:(BOOL)decelerate {
self.countTimer.isOpen = YES;
}
2.4.滑動時的特殊處理。
- (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)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
iOS推送增加右側(cè)顯示圖Service Extension
這篇文章主要為大家介紹了iOS推送增加右側(cè)顯示圖Service Extension,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
ios 流媒體播放器實現(xiàn)流程及FreeStreamer的使用的示例
本篇文章主要介紹了ios 流媒體播放器實現(xiàn)流程及FreeStreamer的使用的示例代碼,非常具有實用價值,需要的朋友可以參考下2018-01-01
iOS使用UIScorllView實現(xiàn)兩指縮放功能
兩指縮放功能不僅可以用UIPinchGestureRecognizer手勢來實現(xiàn),還能用UIScorllView來實現(xiàn),UIScrollView可以輕松的實現(xiàn)最大與最小縮放值,以及滾動的效果,效果非常棒,具體實例代碼大家參考下本文吧2017-03-03
IOS開發(fā)之JSON轉(zhuǎn)PLIST實例詳解
這篇文章主要介紹了IOS開發(fā)之JSON轉(zhuǎn)PLIST實例詳解的相關資料,需要的朋友可以參考下2016-11-11

