麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統(tǒng) > iOS > 正文

iOS實(shí)現(xiàn)無限循環(huán)輪播圖效果

2019-10-21 18:40:16
字體:
供稿:網(wǎng)友

本文實(shí)例為大家分享了iOS實(shí)現(xiàn)無限循環(huán)輪播圖的具體代碼,供大家參考,具體內(nèi)容如下

輪播圖基礎(chǔ)控件,左滑右滑都能無限循環(huán)

預(yù)覽

iOS,輪播圖

思路

(1)在第一張左邊加一張最后一張的圖片,往左滑到邊緣結(jié)束后計(jì)算偏移量迅速定位成最后一張

iOS,輪播圖

#pragma mark - pagecontrol事件// 這個(gè)是點(diǎn)擊小圓點(diǎn)條進(jìn)行切換,到邊不能循環(huán)- (void)pageControlTouched{ // 點(diǎn)擊的時(shí)候停止計(jì)時(shí) [self.kvTimer setFireDate:[NSDate distantFuture]];  // 滑到指定頁面 NSInteger curPageIdx = _pageControl.currentPage; CGFloat offsetX = self.frame.size.width * (curPageIdx + 1); [self.scrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES];  // 重新開啟定時(shí)器 [self.kvTimer setFireDate:[NSDate dateWithTimeInterval:kTimerInterval sinceDate:[NSDate date]]];} #pragma mark - 滾動事件- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{// printf("start drag/n"); // 記錄偏移量 preOffsetX = scrollView.contentOffset.x; // 開始手動滑動時(shí)暫停定時(shí)器 [self.kvTimer setFireDate:[NSDate distantFuture]];} - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{// printf("end drag/n"); // 左右邊界 CGFloat leftEdgeOffsetX = 0; CGFloat rightEdgeOffsetX = self.frame.size.width * (_pageCount + 1);  if (scrollView.contentOffset.x < preOffsetX) {  // 左滑  if (scrollView.contentOffset.x > leftEdgeOffsetX)  {   self.pageControl.currentPage = scrollView.contentOffset.x / self.frame.size.width - 1;  }  else if (scrollView.contentOffset.x == leftEdgeOffsetX)  {   self.pageControl.currentPage = _pageCount - 1;  }    if (scrollView.contentOffset.x == leftEdgeOffsetX)  {   self.scrollView.contentOffset = CGPointMake(self.frame.size.width * _pageCount, 0);  } } else {  // 右滑    // 設(shè)置小點(diǎn)  if (scrollView.contentOffset.x < rightEdgeOffsetX)  {   self.pageControl.currentPage = scrollView.contentOffset.x / self.frame.size.width - 1;  }  else if (scrollView.contentOffset.x == rightEdgeOffsetX)  {   self.pageControl.currentPage = 0;  }    // 滑動完了之后從最后多余頁趕緊切換到第一頁  if (scrollView.contentOffset.x == rightEdgeOffsetX)  {   self.scrollView.contentOffset = CGPointMake(self.frame.size.width, 0);  }  } // 結(jié)束后又開啟定時(shí)器 [self.kvTimer setFireDate:[NSDate dateWithTimeInterval:kTimerInterval sinceDate:[NSDate date]]];} - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{// printf("end scroll/n");} #pragma mark - 定時(shí)器控制的滑動// 往右邊滑- (void)changePageRight{ // 設(shè)置當(dāng)前需要偏移的量,每次遞增一個(gè)page寬度 CGFloat offsetX = _scrollView.contentOffset.x + CGRectGetWidth(self.frame);  // 根據(jù)情況進(jìn)行偏移 CGFloat edgeOffsetX = self.frame.size.width * (_pageCount + 1); // 最后一個(gè)多余頁面右邊緣偏移量  // 從多余頁往右邊滑,趕緊先設(shè)置為第一頁的位置 if (offsetX > edgeOffsetX) {  // 偏移量,不帶動畫,欺騙視覺  self.scrollView.contentOffset = CGPointMake(self.frame.size.width, 0);  // 這里提前改變下一個(gè)要滑動到的位置為第二頁  offsetX = self.frame.size.width * 2; }  // 帶動畫滑動到下一頁面 [self.scrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES]; if (offsetX < edgeOffsetX) {  self.pageControl.currentPage = offsetX / self.frame.size.width - 1; } else if (offsetX == edgeOffsetX) {  // 最后的多余那一頁滑過去之后設(shè)置小點(diǎn)為第一個(gè)  self.pageControl.currentPage = 0; }} // 往左邊滑- (void)changePageLeft{ // 設(shè)置當(dāng)前需要偏移的量,每次遞減一個(gè)page寬度 CGFloat offsetX = _scrollView.contentOffset.x - CGRectGetWidth(self.frame);  // 根據(jù)情況進(jìn)行偏移 CGFloat edgeOffsetX = 0; // 最后一個(gè)多余頁面左邊緣偏移量  // 從多余頁往左邊滑動,先設(shè)置為最后一頁 if (offsetX < edgeOffsetX) {  self.scrollView.contentOffset = CGPointMake(self.frame.size.width * _pageCount, 0);  offsetX = self.frame.size.width * (_pageCount - 1); }  // 帶動畫滑動到前一頁面 [self.scrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES]; if (offsetX > edgeOffsetX) {  self.pageControl.currentPage = offsetX / self.frame.size.width - 1; } else if (offsetX == edgeOffsetX) {  // 最后的多余那一頁滑過去之后設(shè)置小點(diǎn)為最后一個(gè)  self.pageControl.currentPage = _pageCount - 1; }}

(2)總共只有左、中、右三個(gè)頁面,每次滑動后重新進(jìn)行數(shù)據(jù)跟頁面的關(guān)聯(lián)

iOS,輪播圖

#pragma mark - 定時(shí)器回調(diào)- (void)changePageRight{ // 往右滑并且設(shè)置小圓點(diǎn),永遠(yuǎn)都是滑到第三頁 [_scrollView setContentOffset:CGPointMake(self.frame.size.width * 2, 0) animated:YES]; [self resetPageIndex:YES];} - (void)changePageLeft{ // 往左滑,永遠(yuǎn)都是滑動到第一頁 [_scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; [self resetPageIndex:NO];} #pragma mark - 重新設(shè)置索引和頁面圖片- (void)resetPageIndex:(BOOL)isRight{ if (isRight) {  // 根據(jù)之前的page下標(biāo)來修改  if (_prePageIndex == _pageCount - 1)  {   // 到頭了就回到第一個(gè)   _pageControl.currentPage = 0;  }  else  {   // 這里用_prePageIndex來算,否則點(diǎn)擊小圓點(diǎn)條會重復(fù)計(jì)算了   _pageControl.currentPage = _prePageIndex + 1;  } } else {  if (_prePageIndex == 0)  {   _pageControl.currentPage = _pageCount - 1;  }  else  {   _pageControl.currentPage = _prePageIndex - 1;  } } _prePageIndex = _pageControl.currentPage;} - (void)resetPageView{ // 每次滑動完了之后又重新設(shè)置當(dāng)前顯示的page時(shí)中間的page UIImageView *leftPage = [_scrollView viewWithTag:1000]; UIImageView *middlePage = [_scrollView viewWithTag:1001]; UIImageView *rightPage = [_scrollView viewWithTag:1002];  if (_pageControl.currentPage == _pageCount - 1) {  // n- 1 -> n -> 0  leftPage.image = _kvImageArray[_pageControl.currentPage - 1];  middlePage.image = _kvImageArray[_pageControl.currentPage];  rightPage.image = _kvImageArray.firstObject;   } else if (_pageControl.currentPage == 0) {  // n -> 0 -> 1  // 到尾部了,改成從頭開始  leftPage.image = _kvImageArray.lastObject;  middlePage.image = _kvImageArray.firstObject;  rightPage.image = _kvImageArray[1]; } else {  // x - 1 -> x -> x + 1  leftPage.image = _kvImageArray[_pageControl.currentPage - 1];  middlePage.image = _kvImageArray[_pageControl.currentPage];  rightPage.image = _kvImageArray[_pageControl.currentPage + 1]; }  // 重新設(shè)置偏移量 _scrollView.contentOffset = CGPointMake(self.frame.size.width, 0);} #pragma mark - pagecontrol事件- (void)pageControlTouched{ [self stopTimer];  NSInteger curPageIndex = _pageControl.currentPage; if (curPageIndex > _prePageIndex) {  // 右滑  [self changePageRight]; } else {  // 左滑  [self changePageLeft]; }  [self startTimer];} #pragma mark - scrollview滑動代理- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ // 先停掉定時(shí)器 [self stopTimer]; } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ // 手動拖拽滑動結(jié)束后 if (scrollView.contentOffset.x > self.frame.size.width) {  // 右滑  [self resetPageIndex:YES]; } else {  // 左滑  [self resetPageIndex:NO]; } [self resetPageView];  // 開啟定時(shí)器 [self startTimer];} - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{ // 自動滑動結(jié)束后重新設(shè)置圖片 [self resetPageView];}

源代碼下載

csdn:輪播圖
github:輪播圖

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 精品国产1区2区3区 免费国产 | 狼人狠狠干 | av在线免费观看播放 | 日本人乱人乱亲乱色视频观看 | 中文字幕在线视频日本 | 国产精品99久久久久久宅女 | 国产精品久久久久一区二区 | 毛片在线免费视频 | 国产小视频一区 | 国产亚洲欧美一区久久久在 | 国产成人精品无人区一区 | 国产精品免费小视频 | 久久免费精品视频 | 亚洲免费观看视频 | 钻石午夜影院 | 欧美日韩中文字幕在线视频 | 看个毛片| 男女污污视频网站 | av免费在线不卡 | 国产一区免费 | 911色_911色sss主站色播 | 最新一级毛片 | 男男啪羞羞视频网站 | 92看片淫黄大片欧美看国产片 | 一级电影在线观看 | 亚洲精品久久久久久下一站 | 国产一区二区视频观看 | 黄色av免费电影 | 色中色激情影院 | 国产成人77亚洲精品www | 国产亚洲精品久久午夜玫瑰园 | 日本a∨精品中文字幕在线 被啪羞羞视频在线观看 | 亚洲aⅴ免费在线观看 | 欧美大穴 | h色视频网站 | 日韩黄色成人 | gogo全球大胆高清人露出91 | h视频在线免费观看 | 久久精品一二三区白丝高潮 | 麻豆蜜桃在线观看 | 得得啪在线|