iOS開發UI篇—無限輪播(功能完善)app
1、自動滾動oop
添加並設置一個定時器,每一個2.0秒,就跳轉到下一條。佈局
獲取當前正在展現的位置。動畫
1 [self addNSTimer]; 2 } 3 4 -(void)addNSTimer 5 { 6 // NSTimer timerWithTimeInterval:<#(NSTimeInterval)#> target:<#(id)#> selector:<#(SEL)#> userInfo:<#(id)#> repeats:<#(BOOL)#> 7 [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(nextPage) userInfo:nil repeats:YES]; 8 } 9 -(void)nextPage 10 { 11 NSLog(@"%@",[self.collectinView indexPathsForVisibleItems]); 12 // NSIndexPath *currentIndexPath=[[self.collectinView indexPathsForVisibleItems]lastObject]; 13 }
打印查看:atom
實現步驟:spa
(1)添加並設置定時器code
(2)設置定時器的調用方法blog
1)獲取當前正在展現的位置繼承
2)計算出下一個須要展現的位置開發
3)經過動畫滾動到下一個位置
注意點:須要進行判斷。
實現代碼:
1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 //註冊cell 5 // [self.collectinView registerClass:[YYimageCell class] forCellWithReuseIdentifier:YYCell]; 6 [self.collectinView registerNib:[UINib nibWithNibName:@"YYcell" bundle:nil] forCellWithReuseIdentifier:YYIDCell]; 7 8 9 [self.collectinView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:50] atScrollPosition:UICollectionViewScrollPositionLeft animated:YES]; 10 [self addNSTimer]; 11 } 12 13 -(void)addNSTimer 14 { 15 // NSTimer timerWithTimeInterval:<#(NSTimeInterval)#> target:<#(id)#> selector:<#(SEL)#> userInfo:<#(id)#> repeats:<#(BOOL)#> 16 17 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(nextPage) userInfo:nil repeats:YES]; 18 //添加到runloop中 19 [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSRunLoopCommonModes]; 20 } 21 -(void)nextPage 22 { 23 // NSLog(@"%@",[self.collectinView indexPathsForVisibleItems]); 24 //1)獲取當前正在展現的位置 25 NSIndexPath *currentIndexPath=[[self.collectinView indexPathsForVisibleItems]lastObject]; 26 27 //2)計算出下一個須要展現的位置 28 NSInteger nextItem=currentIndexPath.item+1; 29 NSInteger nextSection=currentIndexPath.section; 30 if (nextItem==self.news.count) { 31 nextItem=0; 32 nextSection++; 33 } 34 NSIndexPath *nextIndexPath=[NSIndexPath indexPathForItem:nextItem inSection:nextSection]; 35 36 //3)經過動畫滾動到下一個位置 37 [self.collectinView scrollToItemAtIndexPath:nextIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:YES]; 38 }
定時器的說明:
當用戶在處理其餘事情的時候,定時器會中止工做。應該把定時器添加到runloop中,告訴系統在處理其餘事情的時候分一部分空間給它。
2、設置頁碼
在storyboard中添加一個頁碼控件。
實現代碼:
1 #pragma mark-懶加載 2 -(NSArray *)news 3 { 4 if (_news==nil) { 5 _news=[YYnews objectArrayWithFilename:@"newses.plist"]; 6 self.pageControl.numberOfPages=self.news.count; 7 } 8 return _news; 9 } 10 11 - (void)viewDidLoad 12 { 13 [super viewDidLoad]; 14 //註冊cell 15 // [self.collectinView registerClass:[YYimageCell class] forCellWithReuseIdentifier:YYCell]; 16 [self.collectinView registerNib:[UINib nibWithNibName:@"YYcell" bundle:nil] forCellWithReuseIdentifier:YYIDCell]; 17 18 19 [self.collectinView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:50] atScrollPosition:UICollectionViewScrollPositionLeft animated:YES]; 20 [self addNSTimer]; 21 } 22 23 -(void)addNSTimer 24 { 25 // NSTimer timerWithTimeInterval:<#(NSTimeInterval)#> target:<#(id)#> selector:<#(SEL)#> userInfo:<#(id)#> repeats:<#(BOOL)#> 26 27 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(nextPage) userInfo:nil repeats:YES]; 28 //添加到runloop中 29 [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSRunLoopCommonModes]; 30 } 31 -(void)nextPage 32 { 33 // NSLog(@"%@",[self.collectinView indexPathsForVisibleItems]); 34 //1)獲取當前正在展現的位置 35 NSIndexPath *currentIndexPath=[[self.collectinView indexPathsForVisibleItems]lastObject]; 36 37 //2)計算出下一個須要展現的位置 38 NSInteger nextItem=currentIndexPath.item+1; 39 NSInteger nextSection=currentIndexPath.section; 40 if (nextItem==self.news.count) { 41 nextItem=0; 42 nextSection++; 43 } 44 NSIndexPath *nextIndexPath=[NSIndexPath indexPathForItem:nextItem inSection:nextSection]; 45 46 //3)經過動畫滾動到下一個位置 47 [self.collectinView scrollToItemAtIndexPath:nextIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:YES]; 48 49 //4)設置頁碼 50 self.pageControl.currentPage=nextItem; 51 }
自動滾動,頁碼的實現效果:
3、完善
說明:監聽collectionView的滾動,當手動觸摸collectionView,嘗試拖拽的時候,把定時器停掉,當手指移開的時候,重啓定時器。
完整的實現代碼:
1 // 2 // YYViewController.m 3 // 07-無限滾動(循環利用) 4 // 5 // Created by apple on 14-8-3. 6 // Copyright (c) 2014年 yangyong. All rights reserved. 7 // 8 9 #import "YYViewController.h" 10 #import "MJExtension.h" 11 #import "YYnews.h" 12 #import "YYcell.h" 13 14 #define YYIDCell @"cell" 15 //注意:這裏須要考慮用戶的手動拖拽 16 #define YYMaxSections 100 17 @interface YYViewController ()<UICollectionViewDataSource,UICollectionViewDelegate> 18 @property (weak, nonatomic) IBOutlet UICollectionView *collectinView; 19 @property(nonatomic,strong)NSArray *news; 20 @property (weak, nonatomic) IBOutlet UIPageControl *pageControl; 21 @property(nonatomic,strong)NSTimer *timer; 22 23 @end 24 25 @implementation YYViewController 26 27 #pragma mark-懶加載 28 -(NSArray *)news 29 { 30 if (_news==nil) { 31 _news=[YYnews objectArrayWithFilename:@"newses.plist"]; 32 self.pageControl.numberOfPages=self.news.count; 33 } 34 return _news; 35 } 36 37 - (void)viewDidLoad 38 { 39 [super viewDidLoad]; 40 //註冊cell 41 // [self.collectinView registerClass:[YYimageCell class] forCellWithReuseIdentifier:YYCell]; 42 [self.collectinView registerNib:[UINib nibWithNibName:@"YYcell" bundle:nil] forCellWithReuseIdentifier:YYIDCell]; 43 44 45 [self.collectinView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:50] atScrollPosition:UICollectionViewScrollPositionLeft animated:YES]; 46 [self addNSTimer]; 47 } 48 49 //添加定時器 50 -(void)addNSTimer 51 { 52 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(nextPage) userInfo:nil repeats:YES]; 53 //添加到runloop中 54 [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSRunLoopCommonModes]; 55 self.timer=timer; 56 } 57 58 //刪除定時器 59 -(void)removeNSTimer 60 { 61 [self.timer invalidate]; 62 self.timer=nil; 63 } 64 65 //自動滾動 66 -(void)nextPage 67 { 68 //1獲取當前正在展現的位置 69 NSIndexPath *currentIndexPath=[[self.collectinView indexPathsForVisibleItems]lastObject]; 70 71 //立刻顯示回最中間那組的數據 72 NSIndexPath *currentIndexPathRest=[NSIndexPath indexPathForItem:currentIndexPath.item inSection:YYMaxSections/2]; 73 [self.collectinView scrollToItemAtIndexPath:currentIndexPathRest atScrollPosition:UICollectionViewScrollPositionLeft animated:NO]; 74 75 //2計算出下一個須要展現的位置 76 NSInteger nextItem=currentIndexPathRest.item+1; 77 NSInteger nextSection=currentIndexPathRest.section; 78 if (nextItem==self.news.count) { 79 nextItem=0; 80 nextSection++; 81 } 82 NSIndexPath *nextIndexPath=[NSIndexPath indexPathForItem:nextItem inSection:nextSection]; 83 84 //3經過動畫滾動到下一個位置 85 [self.collectinView scrollToItemAtIndexPath:nextIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:YES]; 86 87 // //4)設置頁碼 88 // self.pageControl.currentPage=nextItem; 89 } 90 91 #pragma mark- UICollectionViewDataSource 92 //一共多少組,默認爲1組 93 -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 94 { 95 return YYMaxSections; 96 } 97 -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 98 { 99 return self.news.count; 100 } 101 102 -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 103 { 104 YYcell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:YYIDCell forIndexPath:indexPath]; 105 cell.news=self.news[indexPath.item]; 106 NSLog(@"%p,%d",cell,indexPath.item); 107 return cell; 108 } 109 110 #pragma mark-UICollectionViewDelegate 111 //當用戶開始拖拽的時候就調用 112 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 113 { 114 [self removeNSTimer]; 115 } 116 //當用戶中止拖拽的時候調用 117 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 118 { 119 [self addNSTimer]; 120 } 121 //設置頁碼 122 -(void)scrollViewDidScroll:(UIScrollView *)scrollView 123 { 124 int page=(int)(scrollView.contentOffset.x/scrollView.frame.size.width+0.5)%self.news.count; 125 self.pageControl.currentPage=page; 126 } 127 @end
補充說明:
實現瀑布流最理想的作法是繼承UIScrollView,不建議使用多個UITableView的方式實現(這種方式沒法實現cell的循環利用,且禁止了cell的滾動時間後,總體的tableView須要隨着滾動會出現空白)。
也能夠使用collectionView來實現,但使用這種方法須要自定義collectionView的佈局(流水佈局)