zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Git 远程仓库 git remote
    同一台电脑关于多个SSH KEY管理
    dotnet core on Linux 环境搭建及入门demo
    Cannot load JDBC driver class 'com.mysql.jdbc.Driver '
    Mac OS 配置Maven
    Linux中profile、bashrc、bash_profile之间的区别和联系
    如何在Mac的Finder中显示/usr、/tmp、/var等隐藏目录
    Mac OS X 下查看和设置JAVA_HOME
    SSM框架整合(IntelliJ IDEA + maven + Spring + SpringMVC + MyBatis)
    事件
  • 原文地址:https://www.cnblogs.com/dm521/p/uiscrollview_uiimageview.html
Copyright © 2011-2022 走看看