zoukankan      html  css  js  c++  java
  • 基于ScrollerView上的滚动视图,自动轮播及pageController控制图片

    1,实现图片轮播需要设置scrollerView 的contentSize 进而通过控制scrollerView的ContentSize实现图片的播放

    2,实现图片的循环播放其实是在轮播的图片首尾各添加一张图片,之后利用时间差来实现图片的循环播放

    3,运用的组件包括 :

            a:UIScrollerView

            b:NSTimer

            c:UIPageControl 

    一,首先创建一个单一的Single View Application

    二,在ViewController.m里面进行声明

    1 {
    2     UIScrollView * scrView;
    3     NSTimer * timer;      //第一个定时器
    4     UIPageControl * pageCon;  //页面控制器
    5     NSTimer * timer2; //第二个定时器
    6 }

    因为项目中用到屏幕的宽的地方比较多,所以我们进行宏定义 

    SCREENWIDTH

     1 #define SCREENWIDTH self.view.frame.size.width 

    三,在viewDidLoad里面创建

     1 - (void)viewDidLoad {
     2     [super viewDidLoad];
     3     
     4     scrView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 20, SCREENWIDTH, 150)];
     5     scrView.delegate = self;  //设置scrollerView的代理
     6     scrView.contentSize = CGSizeMake(SCREENWIDTH * 7, 150); //因项目中是用的5张图片进行循环轮播,所以我们要在首尾各添加一张图片,在第一张图片之前添加第五张图片,在第五章图片之后添加第一张图片  image0和image5是一张图片  image6和image1是一张图片
     7     [self.view addSubview:scrView];
     8     scrView.pagingEnabled = YES; //设置分页
     9     
    10 //在scrollerView内部循环创建7张图片
    11     for (int i = 0 ; i <7; i ++) {
    12         UIImageView * imgView = [[UIImageView alloc]initWithFrame:CGRectMake(i * SCREENWIDTH, 0, SCREENWIDTH, 150)];
    13         imgView.image = [UIImage imageNamed:[NSString stringWithFormat:@"image%d",i]];
    14         [scrView addSubview:imgView];
    15     }
    16     
    17     [scrView setContentOffset:CGPointMake(SCREENWIDTH, 0)];//设置第二张图片在屏幕中显示,这个就是我们要的第一章图片
    18     timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(runLoop) userInfo:nil repeats:YES];//添加定时器
    19     
    20     
    21     pageCon = [[UIPageControl alloc]initWithFrame:CGRectMake(SCREENWIDTH - 200, 130, 200, 40)]; //创建页面控制器
    22     pageCon.numberOfPages = 5;
    23     pageCon.currentPageIndicatorTintColor = [UIColor redColor]; 
    24     pageCon.pageIndicatorTintColor = [UIColor blueColor];
    25     pageCon.currentPage = 0;
    26     [pageCon addTarget:self action:@selector(pageClick) forControlEvents:UIControlEventValueChanged];
    27     [self.view addSubview:pageCon];
    28 }

    四,首先实现UIScrollerView的代理协议

     1 @interface ViewController ()<UIScrollViewDelegate>
     2 #pragma mark - UIScrollerViewDelegate协议方法
     3 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
     4     //scrollView滚动的时候
     5     if (scrView.contentOffset.x == 6 * SCREENWIDTH) {
     6         [scrView setContentOffset:CGPointMake(SCREENWIDTH, 0)animated:NO];
     7     } //如果当scrollerview的偏移到第五张图片的时候 ,设置scrollerView偏移到第一张图片,记得动画效果一定要设置为NO ,不然不会实现循环播放效果
     8     pageCon.currentPage = (scrView.contentOffset.x - SCREENWIDTH)/SCREENWIDTH;  //设置页数控制器的指示页数跟着,图片的循环而变化
     9 }
    10 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
    11     //开始拖拽
    12     [timer invalidate]; //开始拖拽的时候使定时器作废
    13 }
    14 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    15     //结束拖拽
    16 }
    17 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
    18     //开始减速的时候
    19     [timer invalidate]; //开始减速的时候也要设置定时器作废 ,不然的话如果图片在轮播的时候你直接点击不进行拖拽,会出现 bug
    20 } 
    21 
    22 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    23     //结束减速
    24     timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(runLoop) userInfo:nil repeats:YES]; //当图片结束动作的时候添加定时器
    25 }

    五,首先实现页数控制器的点击方法

    1 -(void)pageClick{
    2     [timer invalidate];  //当点击分页控制器的时候,使timer定时器失效
    3     [scrView setContentOffset:CGPointMake((pageCon.currentPage +1) * SCREENWIDTH, 0)]; //设置scrollerView的偏移量根据页数控制器的变化而变化
    4     timer2 = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(looploop) userInfo:nil repeats:NO]; //创建另外一个定时器 ,
    5 }

    六,实现定时器timer2的方法效果

     1 -(void)looploop{

    2 timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(runLoop) userInfo:nil repeats:YES];

    3 } 

    七,实现定时器timer的方法

    1 -(void)runLoop{
    2     [timer2 invalidate];
    3     [scrView setContentOffset:CGPointMake(scrView.contentOffset.x + SCREENWIDTH, 0) animated:YES];
    4     
    5 }

    在这里要说明一下为什么要创建2个定时器,如果不创建第二个定时器,我们点击pageControl的时候timer也就是第一个定时器他还是在工作的,这样当我们点击的时候出现的效果不是很好,我们创建2个定时器的话就可以避免这种情况,记得要在第一个定时器里面设置第二个定时器作废!!!!!

    之后我们的效果就实现了

    看一下静态效果(只能看静态效果了,视屏不会传)

    祝大家早日成大牛...

  • 相关阅读:
    我的第九个java程序--spring和mybatis整合(java project)
    php 批量插入字段
    php 遍历静态html成文章列表
    把world转成html
    java 读取world的图片 并把图片路径存入数据库
    我的第八个java程序--读取word内容
    我的第7个java程序--把java web项目改为java project项目--mybatis
    我的第六个java程序 spring-bean
    学习spring2--跟我一起学Spring 3(3)–使用Spring开发第一个HelloWorld应用
    学习spring1--跟我一起学Spring 3(2)–开发环境配置
  • 原文地址:https://www.cnblogs.com/JustForHappy/p/5711602.html
Copyright © 2011-2022 走看看