UIScrollView,UIPageControl,UIImageView 實現圖片輪播的效果


上一篇博客介紹了如何將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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM