国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS利用UIScrollView實現無限滾動效果

2020-07-26 03:03:06
字體:
來源:轉載
供稿:網友

前言

眾所周知UIScrollView 的無限滾動主要應用在圖片輪播器、歡迎界面等場景。它的原理是在要顯示的圖片前后各加一張圖片即在第一張圖片之前放最后一張圖片,在最后一張圖片之后放第一張圖片,然后在滾動到邊緣的時候,巧妙的過渡一下就可以"瞞天過海","以假亂真"的造成無限滾動的假象。網絡上有很多只用三張或兩張圖片實現的方法,效率比這個方法高,但實現起來稍微麻煩一點,有興趣的可以去深入研究。

實現步驟

      1、根據需求準備幾張圖片,在網上找了5張圖片,分別命名為 img_01,img_02,img_03,img_04,img_05 。

      2、代碼實現,主要分為:添加UIScrollView,添加顯示圖片,添加UIPageControl,然后監聽UIScrollView的滾動,根據滾動的位置來設置UIPageControl,最重要的是對于滾動到兩個邊緣時要特殊處理一下

代碼如下:

#import "ViewController.h"http://屏幕寬度#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width//圖片高度#define IMG_HEIGHT 180//要顯示的圖片總數#define MAX_SIZE 7#import "ViewController.h"@interface ViewController () <UIScrollViewDelegate>//滾動視圖@property (strong, nonatomic) UIScrollView *loopScrollView;//指示器@property (strong, nonatomic) UIPageControl *pageIndicator;//要展示的圖片數組@property(strong, nonatomic) NSMutableArray *imgArray;@end@implementation ViewController//懶加載數組-(NSMutableArray *)imgArray{  if(_imgArray == nil)  {    _imgArray = [[NSMutableArray alloc]initWithCapacity:MAX_SIZE];    //在要展示的5張圖片的前后各加一張圖片,第一張前面加第五張,第五張后面加第一張    [_imgArray addObject:[UIImage imageNamed:@"img_05.jpg"]];    for (int i = 1; i< MAX_SIZE - 1; i++) {      NSString *imgName = [[NSString alloc]initWithFormat:@"img_0%d.jpg", i];      [_imgArray addObject:[UIImage imageNamed:imgName]];    }    [_imgArray addObject:[UIImage imageNamed:@"img_01.jpg"]];  }  return _imgArray;}- (void)viewDidLoad {  [super viewDidLoad];  [self setupScrollView];  [self setupPageControl];}/** * 創建UIScrollView并設置其屬性 */-(void)setupScrollView{  UIScrollView *sc = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 64, SCREEN_WIDTH, IMG_HEIGHT)];  //創建UIImageView并添加到UIScrollView中  for (int i = 0; i< MAX_SIZE; i++) {    UIImageView *img = [[UIImageView alloc]initWithImage:[self.imgArray objectAtIndex:i]];    img.frame = CGRectMake(SCREEN_WIDTH * i, 0, SCREEN_WIDTH, IMG_HEIGHT);    [sc addSubview:img];  }  //設置UIScrollView的屬性  sc.contentSize = CGSizeMake(SCREEN_WIDTH * self.imgArray.count, IMG_HEIGHT);  sc.showsHorizontalScrollIndicator = NO;  sc.pagingEnabled = YES;  //剛開始應該滾動到第二張顯示,因為第一張其實是最后一張圖片  [sc setContentOffset:CGPointMake(SCREEN_WIDTH, 0) animated:NO];  //設置代理并添加到當前view中  sc.delegate = self;  [self.view addSubview:sc];  self.loopScrollView = sc;}/** * 創建UIPageControl并設置其屬性 */-(void)setupPageControl{  //注意frame,這樣設置可以居中顯示  UIPageControl *pc = [[UIPageControl alloc]initWithFrame:CGRectMake(self.view.center.x - 50, CGRectGetMaxY(self.loopScrollView.frame) - 25 , 100, 25)];  //設置UIPageControl的屬性并添加到當前view中  pc.numberOfPages = MAX_SIZE - 2;  pc.currentPage = 0;  pc.pageIndicatorTintColor = [UIColor redColor];  [self.view addSubview:pc];  self.pageIndicator = pc;}//UIScrollView的代理方法,在該方法中改變UIPageControl并且處理邊緣滾動-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{  //獲取當前UIScrollView的位置  CGPoint offset = [scrollView contentOffset];  //算出滾動到第幾頁  int currentPage = offset.x/SCREEN_WIDTH;  //設置UIPageControl  self.pageIndicator.currentPage = currentPage - 1;  //對最后一張和第一張要進行特殊處理  //1、如果是第一張  if (currentPage == 0) {    //下面兩個方法任選其一都可以達到效果,但是注意動畫一定要設置為NO,不然會有視覺會有辣眼睛的感覺    //方法1    [self.loopScrollView setContentOffset:CGPointMake(SCREEN_WIDTH * (MAX_SIZE-2), 0) animated:NO];    //方法2,該方法要求設置contentSize時,任一方向就算不滾動也不能為0,否則無效    //[self.loopScrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH * (MAX_SIZE-2), 0, SCREEN_WIDTH, IMG_HEIGHT) animated:NO];    self.pageIndicator.currentPage = MAX_SIZE - 2;  }  //2、如果是最后一張  else if(currentPage == MAX_SIZE - 1) {    [self.loopScrollView setContentOffset:CGPointMake(SCREEN_WIDTH, 0) animated:NO];    //[self.loopScrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH, 0, SCREEN_WIDTH, IMG_HEIGHT) animated:NO];    self.pageIndicator.currentPage = 0;  }}@end

實現效果

總結

好了,以上就是這篇文章的全部內容了,其實實現輪播現在最好的方案應該是使用UICollectionView,因為它是利用重用機制來實現的,性能會好很多,代碼寫起來類似。希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凌海市| 紫阳县| 商南县| 麻阳| 河源市| 台东县| 青川县| 荃湾区| 广汉市| 泗洪县| 明溪县| 临沭县| 江孜县| 阿巴嘎旗| 合川市| 布拖县| 富阳市| 睢宁县| 新泰市| 新丰县| 鄢陵县| 夏津县| 滦南县| 巍山| 贵州省| 庆云县| 德州市| 康乐县| 沂水县| 白水县| 丰台区| 丁青县| 锡林浩特市| 霞浦县| 雅江县| 赤壁市| 株洲县| 七台河市| 曲阜市| 德化县| 定结县|