zoukankan      html  css  js  c++  java
  • iOS --UIScrollView的学习(三)自动轮播

    1、前面两章讲的都是基本的用法,这次讲一下比较重要的功能分页和自动播放

    2、UIPageControl--分页

    2.1只要将UIScrollView的pageEnabled属性设置为YES,UIScrollView会被分割成多个独立页面,里面的内容就能进行分页展示,一般会配合UIPageControl增强分页效果,UIPageControl常用属性如下 

    1)一共有多少页

    @property(nonatomic) NSInteger numberOfPages;

    2)当前显示的页码

    @property(nonatomic) NSInteger currentPage; 

     3)只有一页时,是否需要隐藏页码指示器

    @property(nonatomic) BOOL hidesForSinglePage; 

    4)其他页码指示器的颜色

    @property(nonatomic,retain) UIColor *pageIndicatorTintColor;

    5)当前页码指示器的颜色

    @property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;

    3、NSTimer

    3.1、NSTimer叫做“定时器”,它的作用如下:

    1)在指定的时间执行指定的任务

    2)每隔一段时间执行指定的任务

    3.2、调用下面的方法就会开启一个定时任务

    + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget 

    selector:(SEL)aSelector 

    userInfo:(id)userInfo 

    repeats:(BOOL)yesOrNo;

    每隔ti秒,调用一次aTarget的aSelector方法,yesOrNo决定了是否重复执行这个任务

    3.3、通过invalidate方法可以停止定时器的工作,一旦定时器被停止了,就不能再次执行任务。只能再创建一个新的定时器才能执行新的任务

    - (void)invalidate;

    4、大体思路:

    在前面+最后一张,在最后面+第一张,也就是说如果你有三张图片的话在第0个位置放最后一张,在第4个位置放第一张,总共的contentsize是imageNum+ 2。

    代码如下:

      1 - (void)viewDidLoad {
      2     [super viewDidLoad];
      3     //初始化scrollView
      4     [self setupScrollView];
      5     //初始化pageControl
      6     [self setupPageControl];
      7 }
      8 - (void)setupScrollView
      9 {
     10     _fzhScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 64, SCREEN_WIDTH, 200)];
     11     
     12     _fzhScrollView.contentSize = CGSizeMake(SCREEN_WIDTH * (imageNum +2) , 0);
     13     
     14     for (int i = 0; i<imageNum + 2; i++) {
     15         UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(i * SCREEN_WIDTH, 64, SCREEN_WIDTH, 200)];
     16         if (i == 0) {
     17             imageView.image = [UIImage imageNamed:@"3.jpg"];
     18         }else if (i == imageNum + 1){
     19             imageView.image = [UIImage imageNamed:@"1.jpg"];
     20         }else{
     21             imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i]];
     22         }
     23         [_fzhScrollView addSubview:imageView];
     24     }
     25     
     26     _fzhScrollView.contentOffset = CGPointMake(SCREEN_WIDTH, 0);
     27     _fzhScrollView.bounces = NO;
     28     _fzhScrollView.showsHorizontalScrollIndicator = NO;
     29     _fzhScrollView.pagingEnabled = YES;
     30     _fzhScrollView.delegate = self;
     31     //添加定时器
     32     [self addTimer];
     33     [self.view addSubview:_fzhScrollView];
     34     
     35 }
     36 /**
     37  *  添加定时器
     38  */
     39 - (void)addTimer
     40 {
     41     self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
     42     [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
     43 }
     44 /**
     45  *  移除定时器
     46  */
     47 - (void)removeTimer
     48 {
     49     [self.timer invalidate];
     50     self.timer = nil;
     51 }
     52 - (void)nextImage
     53 {
     54     //1.计算page
     55     int page = 0;
     56     if (_pageCtl.currentPage == imageNum - 1) {
     57         page = 0;
     58     } else {
     59         page = (int)_pageCtl.currentPage + 1;
     60     }
     61     //如果在第0个位置,把滑动位置设置为最后一张
     62     if (_fzhScrollView.contentOffset.x == 0) {
     63         _fzhScrollView.contentOffset = CGPointMake(imageNum * SCREEN_WIDTH, 0);
     64         //如果在第imageNum + 1个位置,把滑动位置设置为第一张
     65     }else if (_fzhScrollView.contentOffset.x == (imageNum + 1) * SCREEN_WIDTH){
     66         _fzhScrollView.contentOffset = CGPointMake(SCREEN_WIDTH, 0);
     67     }else{
     68         CGFloat offsetX = _fzhScrollView.contentOffset.x;
     69         offsetX  = offsetX + SCREEN_WIDTH;
     70          _fzhScrollView.contentOffset = CGPointMake(offsetX, 0);
     71     }
     72 }
     73 //创建分页控制器
     74 - (void)setupPageControl
     75 {
     76     _pageCtl = [[UIPageControl alloc]initWithFrame:CGRectMake(0, 400, SCREEN_WIDTH, 60)];
     77     
     78     _pageCtl.numberOfPages = imageNum;
     79     
     80     _pageCtl.backgroundColor = [UIColor blackColor];
     81     
     82     [self.view addSubview:_pageCtl];
     83     
     84 }
     85 
     86 #pragma mark ---UIScrollViewDelegate
     87 /**
     88  *  当scrollView正在滚动就会调用
     89  */
     90 - (void)scrollViewDidScroll:(UIScrollView *)scrollView
     91 {
     92     //如果在第0个位置,把滑动位置设置为最后一张
     93     if (_fzhScrollView.contentOffset.x == 0) {
     94         _fzhScrollView.contentOffset = CGPointMake(imageNum * SCREEN_WIDTH, 0);
     95         _pageCtl.currentPage = imageNum;
     96         //如果在第imageNum + 1个位置,把滑动位置设置为第一张
     97     }else if (_fzhScrollView.contentOffset.x == (imageNum + 1) * SCREEN_WIDTH){
     98         _fzhScrollView.contentOffset = CGPointMake(SCREEN_WIDTH, 0);
     99         _pageCtl.currentPage = 0;
    100     }else{
    101         
    102         _pageCtl.currentPage = (scrollView.contentOffset.x + SCREEN_WIDTH * 0.5)/SCREEN_WIDTH -1;
    103     }
    104     
    105 }
    106 /**
    107  *  开始拖拽的时候调用
    108  */
    109 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    110 {
    111     // 停止定时器(一旦定时器停止了,就不能再使用)
    112     [self removeTimer];
    113 }
    114 
    115 /**
    116  *  停止拖拽的时候调用
    117  */
    118 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
    119 {
    120     // 开启定时器
    121     [self addTimer];
    122 }

    demo:下载地址:https://github.com/fengzhihao123/FZHAutoScrollView;

    tip:如果出现图片不存在的错误,自己再拖拽进3张图片修改一下名称即可!

  • 相关阅读:
    100万并发连接服务器笔记之1M并发连接目标达成
    100万并发连接服务器笔记之测试端就绪
    配置JBoss环境变量
    100万并发连接服务器笔记之Java Netty处理1M连接会怎么样
    JBoss启动项目报错
    eclipse在线安装JBoss Tool过程
    安装JBoss Tool 出错
    eclipse怎么恢复原状
    Java使用foreach遍历集合元素
    Java之Iterator
  • 原文地址:https://www.cnblogs.com/fengzhihao/p/5288086.html
Copyright © 2011-2022 走看看