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

posted @ 2013-07-02 11:51  坤坤  阅读(15868)  评论(5编辑  收藏  举报