上一篇博客介紹了如何將XCode創立的項目提交到Git版本控制,這次就直接做一個圖片輪播的展示demo,剛好可以把UIScrollView、UIPageControl、UIImageView這三個控件講解分析一下。先上效果,這樣比較直觀。
從圖中可以看到這個界面是由UIImageView 和 UITableView 組合而成。在這里UITableView的內容不作為本次講解的重點,如果對UITableView的使用有疑問的,可以留言給我。下面就進入正題,在頭文件創建幾個變量。
1 @interface ScrollImageViewController : UIViewController<UIScrollViewDelegate> 2 { 3 BOOL isFromStart; 4 } 5 6 @property(nonatomic, strong)UIScrollView *scrollView; //聲明一個UIScrollView 7 @property(nonatomic, strong)UIPageControl *pageControl; //聲明一個UIPageControl 8 @property(nonatomic, strong)NSArray *arrayImages; //存放圖片的數組 9 @property(nonatomic, strong)NSMutableArray *viewController; //存放UIViewController的可變數組 10 @end
下面在.m文件中創建這些聲明變量
1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 // Do any additional setup after loading the view. 5 6 self.arrayImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"3201.jpg"],[UIImage imageNamed:@"3202.jpg"],[UIImage imageNamed:@"3203.jpg"],[UIImage imageNamed:@"3204.jpg"], nil]; 7 8 _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width,ImageHeight)]; 9 [_scrollView setPagingEnabled:YES]; 10 _scrollView.showsHorizontalScrollIndicator = NO; 11 _scrollView.showsVerticalScrollIndicator = NO; 12 [_scrollView setDelegate:self]; 13 [_scrollView setBackgroundColor:[UIColor lightGrayColor]]; 14 15 //ContentSize 這個屬性對於UIScrollView挺關鍵的,取決於是否滾動。 16 [_scrollView setContentSize:CGSizeMake(CGRectGetWidth(self.view.frame) * [self.arrayImages count], ImageHeight)]; 17 [self.view addSubview:_scrollView]; 18 19 _pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, self.scrollView.frame.size.height - 20, 320, 20)]; 20 [_pageControl setBackgroundColor:[UIColor blackColor]]; 21 22 _pageControl.currentPage = 0; 23 _pageControl.numberOfPages = [self.arrayImages count]; 24 [_pageControl addTarget:self action:@selector(chagePage:) forControlEvents:UIControlEventValueChanged]; 25 [self.view addSubview:_pageControl]; 26 27 _viewController = [[NSMutableArray alloc] init]; 28 29 for (NSInteger i = 0; i < [self.arrayImages count]; i++) { 30 [_viewController addObject:[NSNull null]]; 31 } 32 33 _timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(scrollPages) userInfo:nil repeats:YES]; 34 35 [self loadScrollViewPage:0]; 36 [self loadScrollViewPage:1]; 37 [self loadScrollViewPage:2]; 38 [self loadScrollViewPage:3]; 39 }
下面是實現loadScrollViewPage的方法,因為這里用到了定時器的自動滾動,所以在viewDidLoad里面把所有的圖片都自動裝載進去了。
1 -(void)loadScrollViewPage:(NSInteger)page 2 { 3 if (page >= self.arrayImages.count) { 4 return; 5 } 6 7 UIViewController *imageViewController = [self.viewController objectAtIndex:page]; 8 if ((NSNull *)imageViewController == [NSNull null]) 9 { 10 imageViewController = [[UIViewController alloc] init]; 11 [self.viewController replaceObjectAtIndex:page withObject:imageViewController]; 12 } 13 14 if (imageViewController.view.superview == nil) { 15 CGRect frame = self.scrollView.frame; 16 frame.origin.x = CGRectGetWidth(frame) * page; 17 frame.origin.y = 0; 18 imageViewController.view.frame = frame; 19 20 //[self addChildViewController:imageViewController]; 21 [self.scrollView addSubview:imageViewController.view]; 22 [imageViewController didMoveToParentViewController:self]; 23 24 [imageViewController.view setBackgroundColor:[UIColor colorWithPatternImage:(UIImage *)[self.arrayImages objectAtIndex:page]]]; 25 } 26 }
接下來的工作就是要實現UIScrollView的委托方法,實現橫向滾動來切換到下一圖片,以及UIPageControl 切換圖片的方法,先看看scrollViewDidEndDecelerating的方法聲明吧。
1 -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 2 { 3 CGFloat pageWidth = CGRectGetWidth(self.scrollView.frame); 4 NSInteger page = floor((self.scrollView.contentOffset.x -pageWidth/2)/pageWidth) +1; 5 self.pageControl.currentPage = page; 6 7 [self loadScrollViewPage:page-1]; 8 [self loadScrollViewPage:page]; 9 [self loadScrollViewPage:page+1]; 10 }
然后就是UIPageControl的changePage 方法。
1 - (IBAction)changePage:(id)sender 2 { 3 NSInteger page = self.pageControl.currentPage; 4 5 [self loadScrollViewPage:page - 1]; 6 [self loadScrollViewPage:page]; 7 [self loadScrollViewPage:page + 1]; 8 9 CGRect bounds = self.scrollView.bounds; 10 bounds.origin.x = CGRectGetWidth(bounds) * page; 11 bounds.origin.y = 0; 12 [self.scrollView scrollRectToVisible:bounds animated:YES]; 13 }
最后的任務就是要完成在viewDidLoad里面對NSTimer聲明的切換圖片的方法。
1 -(void)scrollPages{ 2 ++self.pageControl.currentPage; 3 CGFloat pageWidth = CGRectGetWidth(self.scrollView.frame); 4 if (isFromStart) { 5 [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; 6 self.pageControl.currentPage = 0; 7 } 8 else 9 { 10 [self.scrollView setContentOffset:CGPointMake(pageWidth*self.pageControl.currentPage, self.scrollView.bounds.origin.y)]; 11 12 } 13 if (_pageControl.currentPage == _pageControl.numberOfPages - 1) { 14 isFromStart = YES; 15 } 16 else 17 { 18 isFromStart = NO; 19 } 20 }
以上就是實現效果圖中所需要的代碼了。制作這個demo的時候參照了SDK里面的PageControl的代碼,然后自己動手加工完成的。
參考文獻:
https://developer.apple.com/library/ios/#samplecode/PageControl/Introduction/Intro.html