最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年07月22日 09:39:55   作者:踏莎行hyx  
這篇文章主要為大家詳細介紹了iOS實現(xiàn)無限循環(huán)輪播圖效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

預覽

思路

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

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

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

#pragma mark - 定時器回調(diào)
- (void)changePageRight
{
 // 往右滑并且設置小圓點,永遠都是滑到第三頁
 [_scrollView setContentOffset:CGPointMake(self.frame.size.width * 2, 0) animated:YES];
 [self resetPageIndex:YES];
}
 
- (void)changePageLeft
{
 // 往左滑,永遠都是滑動到第一頁
 [_scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
 [self resetPageIndex:NO];
}
 
#pragma mark - 重新設置索引和頁面圖片
- (void)resetPageIndex:(BOOL)isRight
{
 if (isRight)
 {
 // 根據(jù)之前的page下標來修改
 if (_prePageIndex == _pageCount - 1)
 {
  // 到頭了就回到第一個
  _pageControl.currentPage = 0;
 }
 else
 {
  // 這里用_prePageIndex來算,否則點擊小圓點條會重復計算了
  _pageControl.currentPage = _prePageIndex + 1;
 }
 }
 else
 {
 if (_prePageIndex == 0)
 {
  _pageControl.currentPage = _pageCount - 1;
 }
 else
 {
  _pageControl.currentPage = _prePageIndex - 1;
 }
 }
 _prePageIndex = _pageControl.currentPage;
}
 
- (void)resetPageView
{
 // 每次滑動完了之后又重新設置當前顯示的page時中間的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];
 }
 
 // 重新設置偏移量
 _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
{
 // 先停掉定時器
 [self stopTimer];
 
}
 
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
 // 手動拖拽滑動結束后
 if (scrollView.contentOffset.x > self.frame.size.width)
 {
 // 右滑
 [self resetPageIndex:YES];
 }
 else
 {
 // 左滑
 [self resetPageIndex:NO];
 }
 [self resetPageView];
 
 // 開啟定時器
 [self startTimer];
}
 
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
 // 自動滑動結束后重新設置圖片
 [self resetPageView];
}

源代碼下載

csdn:輪播圖
github:輪播圖

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • iOS開發(fā)教程之UIView和UIViewController的生命周期詳解

    iOS開發(fā)教程之UIView和UIViewController的生命周期詳解

    UIViewController是IOS程序中的一個重要組成部分,下面這篇文章主要給大家介紹了關于iOS開發(fā)教程之UIView和UIViewController的生命周期的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-04-04
  • iOS使用UICollectionView實現(xiàn)橫向滾動照片效果

    iOS使用UICollectionView實現(xiàn)橫向滾動照片效果

    這篇文章主要為大家詳細介紹了iOS使用UICollectionView實現(xiàn)橫向滾動照片效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • iOS如何固定UITableView中cell.imageView.image的圖片大小

    iOS如何固定UITableView中cell.imageView.image的圖片大小

    這篇文章主要給大家介紹了關于iOS如何固定UITableView中cell.imageView.image圖片大小的相關資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-11-11
  • iOS實現(xiàn)音頻進度條效果

    iOS實現(xiàn)音頻進度條效果

    這篇文章主要介紹了ios實現(xiàn)音頻進度條效果,本文寫了一個小demo通過實例代碼相結合的形式給大家詳細介紹,需要的朋友可以參考下
    2018-10-10
  • Objective-C關鍵字@property使用原理探究

    Objective-C關鍵字@property使用原理探究

    這篇文章主要為大家介紹了Objective-C關鍵字@property使用原理探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • iOS中的3種定時器匯總介紹

    iOS中的3種定時器匯總介紹

    這篇文章主要介紹了iOS中的3種定時器匯總介紹的相關資料,需要的朋友可以參考下
    2023-05-05
  • ios啟動頁強制豎屏(進入App后允許橫屏與豎屏)

    ios啟動頁強制豎屏(進入App后允許橫屏與豎屏)

    最近工作遇到這樣一個需要,當進入啟動頁需要強制豎屏,而進入APP后就允許橫屏與豎屏,通過查找相關的資料找到了解決的方法,所以將實現(xiàn)的方法整理后分享出來,需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • iOS禁止所有輸入法表情的方法

    iOS禁止所有輸入法表情的方法

    這篇文章主要為大家詳細介紹了iOS禁止所有輸入法表情的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • IOS 中l(wèi)oadView,viewDidLoad,viewDidUnload詳解及使用

    IOS 中l(wèi)oadView,viewDidLoad,viewDidUnload詳解及使用

    這篇文章主要介紹了IOS 中l(wèi)oadView,viewDidLoad,viewDidUnload詳解及使用的相關資料,需要的朋友可以參考下
    2017-02-02
  • iOS11 WKWebView內(nèi)容過濾規(guī)則詳解

    iOS11 WKWebView內(nèi)容過濾規(guī)則詳解

    本篇文章主要介紹了iOS11 WKWebView內(nèi)容過濾規(guī)則詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論

饶河县| 龙岩市| 凤凰县| 甘肃省| 漳平市| 海门市| 金秀| 保定市| 宜州市| 抚远县| 易门县| 榆林市| 南靖县| 岐山县| 湘潭市| 朝阳市| 镇原县| 益阳市| 日喀则市| 石林| 西乌| 昭平县| 四子王旗| 达尔| 桂平市| 合肥市| 九江县| 巩留县| 南皮县| 浦北县| 石棉县| 平安县| 西昌市| 阿克| 靖边县| 浮山县| 玉林市| 乌审旗| 霞浦县| 清水河县| 南岸区|