iOS开发之定时滑动图片(UIPageControl,UIScrollView)

来源:互联网 发布:tt手机语音软件 编辑:程序博客网 时间:2024/05/18 17:56

     才做了两个月的IOS开发,从一个材料专业的学生,变为菜鸟程序员,对软件也产生了兴趣,最近在做一个项目,希望自己能够把项目中的东西记下来(毕竟是处女作),要把做过的与大家分享一下:

     对于这个项目首先就是研究了一下:UIPageControl and UIScrollView 来制作一个定时滑动的图片,并且增加手势功能。


     首先给出.h代码:

//

//  ViewController.h

//  ScrollViewDemo

//

//  Created by duostec on 13-9-21.

//  Copyright (c) 2013 zhouxiaoyu. All rights reserved.

//


#import <UIKit/UIKit.h>



@interface ScrollAndPageController :UIViewController<UIScrollViewDelegate,UIGestureRecognizerDelegate>


{

   BOOL flag ; //用于判断图片滚动到第一张或者最后一张

    UIPageControl *pageController; //定义UIPageControl

   NSInteger picNum;//用于计算一共有多少张图片

   NSArray *imageNames;//用于存放一组图片的名字

   UIScrollView *scroll;//定义UIScrollView

}

-(id)initWithImageNumber:(NSInteger) picNums andImageName:(NSArray *)imageNamess; //初始化方法指定图片的数量,以及图片的一组名字

@end

其中实现了两个代理,第一个是:UIScrollViewDelegate 其中的代理方法

-(void)scrollViewDidScroll:(UIScrollView *)scrollView是当scroll滑动动作完成之后回自动触发此事件(当然要设置scroll的代理,我经常忘记设置代理);

第二个代理:UIGestureRecognizerDelegate 其中的代理方法其中的一些方法与手势有关,但此程序好像用处不大;



写完了.h文件接下来是.m文件

//

//  ViewController.m

//  ScrollViewDemo

//

//  Created by duostec on 13-9-21.

//  Copyright (c) 2013 zhouxiaoyu. All rights reserved.

//


#import "ScrollAndPageController.h"

#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640,1136), [[UIScreen mainScreen] currentMode].size) : NO)


@interface ScrollAndPageController ()


@end


@implementation ScrollAndPageController


-(id)initWithImageNumber:(NSInteger) picNums andImageName:(NSArray *)imageNamess //初始化放法,需要传入图片的数量和图片的名字

{

   if(self = [superinit]){

       picNum = picNums;

       imageNames = imageNamess;

    }

    return self;

}


- (void)viewDidLoad

{

    [superviewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

   

    scroll = [[UIScrollViewalloc]initWithFrame:CGRectMake(0,0,310,120)];

   //定义scrollView 的显示大小

/*

 *scrollView有显示区域大小和内容区域大小之分

 *两者的区别在于,显示是用户可以看到的区域,而内容区域则是存放多个显示区域

*/

    for (int i =0; i<picNum; i++) 

    {

       UIImageView *newView = [[UIImageViewalloc]initWithImage:[UIImageimageNamed:imageNames[i]]];//实例化一个ImageView用来作为图片的容器

       [newViewsetClipsToBounds:YES];             //当图片的大小大于ImageView时不显示多出   //ImageView的区域

       newView.frame =CGRectMake(i*(310),0,310,120);   //指定ImageView的区域大小

/*

 * 我要让多张图片在scrollView上横向滑动,所以关于x的起点坐标将会根据图片数量、以及图片的宽度有关

 * scrollView的内容区域将随着图片数量的改变而改变,但是显示区域是一定的,就像透过窗户看黄河,河水是动的,窗户是静止的

*/

       [scrolladdSubview:newView];   //在scrollView上加入ImageView;

    }

   scroll.contentSize =CGSizeMake(310*picNum,120);//这就是设置scrollView的内容视图大小

   scroll.tag               =101;

   pageController      = [[UIPageControlalloc]initWithFrame:CGRectMake(0,120,320,20)]; //为pageControl实例化,初始化

    scroll.pagingEnabled                           =YES;  //以显示窗口为标准进行翻页动作

    scroll.scrollEnabled                              =YES//是否可以滑动

    scroll.showsHorizontalScrollIndicator  =NO;  //不现实水平滚动轴

    scroll.showsVerticalScrollIndicator       =NO;        //不现实垂直滚动轴

    scroll.delegate =self  //为ScrollView设置代理

    [pageControllersetNumberOfPages:picNum];             //设置pageControl总页数,就是一共多少张图片就多少张页数

    [pageControllersetCurrentPage:0]; //设置程序加载时显示的页数

    

    pageController.backgroundColor    = [UIColorgrayColor];

    pageController.tag                          =102;

    UIPanGestureRecognizer *tapRec = [[UIPanGestureRecognizeralloc]initWithTarget:self action@selector(changePageByGes:)];//实例化手//势识别操作

    tapRec.delegate                             =self;

    

    [pageController addTarget:self action:@selector(changePage:)forControlEvents:UIControlEventValueChanged];

    [self.view addSubview:scroll];

    [self.view addSubview:pageController];//增加pageControl为子视图

    [self.view addGestureRecognizer:tapRec];//为view增加手势

/*

 *为手势增加事件,当左右滑动时触发-(void)changePageByGes:(UIPanGestureRecognizer *)rec方法

 *为pageControl增加事件,当前页数发生改变时触发-(void)changePage:(UIPageControl *)pageChange方法

 *如下进行定时滑动,每隔四秒调用函数-(void)changePage

*/

   if(picNum>1)

    {

        [NSTimerscheduledTimerWithTimeInterval:4target:selfselector:@selector(changePage)userInfo:nilrepeats:YES];

    }

}


- (void)didReceiveMemoryWarning

{

    [superdidReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


-(void)changePage:(UIPageControl *)pageChange  //

{

       int witch = pageChange.currentPage;

        [scroll setContentOffset:CGPointMake(witch*310,0)animated:YES];

/*

 *此方法作用是当pageControl的当前页数改变时,绑定ScrollView的偏移量随之改变witch*310(因为图片是加载到ScrollView上的)

 *setContentOffset方法用来指定x,y偏移0,0位置的数量,可以NSLog一下就明白了

*/

}


-(void)changePage

{

/*

 *此方法是用来定时滑动的flag用来判断滑动到了第一张还是最后一张,当到达了最后一张时应该向左滑动,当到达第一张时应该向右滑动

*/

    

    if(pageController.currentPage ==0)

    {

       flag =YES;//如果当前的pageControll页数是第一张,flag为真

    }

    if(pageController.currentPage ==picNum-1)

    {

       flag =NO;//如果当前的PageControl页数是最后一张,flag为假

    }

   if(flag)

    {

//当前的pageControl页数是第一张时,向右滑动

       int witch =pageController.currentPage+1;

        //pageController.currentPage = pageController.currentPage + 1 ;

        [scrollsetContentOffset:CGPointMake(witch*310,0)animated:YES];

            }

   else

    {

//当前的pageControll页数是最后一张时,向左滑动

       int witch =pageController.currentPage-1;

        //pageController.currentPage = pageController.currentPage -1;

        [scrollsetContentOffset:CGPointMake(witch*310,0)animated:YES];

        

    }

}



-(void)scrollViewDidScroll:(UIScrollView *)scrollView

{

/*

 *这个scrollView的代理方法写的有些粗糙,以后待改进,三个if句只是为了判断当前的页数是不是大于等于零,小于最大图片数

 *当滑动的偏移量转(当前页数)不在我们要求的范围内时,这个代理方法什么也不做

*/

   UIPageControl *pageControl = (UIPageControl *)[self.viewviewWithTag:102];

    UIScrollView *scroll0 = (UIScrollView *)[self.viewviewWithTag:101];

    

   if ([scrollViewisEqual:scroll0])

    {

       staticint lastPageIndex =0;

       CGFloat pageWidth = scrollView.frame.size.width;

       NSInteger pageIndex =floor((scrollView.contentOffset.x - pageWidth /2) / pageWidth) +1; //此处就是通过计算scrollView的当前偏移量      //来计算pageControl的当前页数(函数的精华啊)

       if (lastPageIndex != pageIndex)

        {

           if (pageIndex >=0 && pageIndex <=picNum-1)

            {

                [pageControlsetCurrentPage:pageIndex];//计算当前页数

                lastPageIndex = pageIndex;

                //NSLog(@"%.2f",scrollView.contentOffset.x);

            }

        }

    }

}


-(void)changePageByGes:(UIPanGestureRecognizer *)rec

{

/*

 *用于用户滑动PageControl时改变当前页数和显示的图片

*/

    if(rec.state ==UIGestureRecognizerStateEnded) //判断手势动作的状态(要选择结束,也可以换成其他状态,但是效果会变不同)

    {

       CGPoint xPoint = [rectranslationInView:pageController];//通过translationInView来判断用户的左右滑动;

       NSLog(@"%f-------------",xPoint.x);

       if(xPoint.x >0) //向右

        {

            if(pageController.currentPage <picNum-1)

            {

               int witch =pageController.currentPage +1;

                [scrollsetContentOffset:CGPointMake(witch*310,0)animated:YES];

               pageController.currentPage ++ ;

            }

        }

      if(xPoint.x<0)//向左

       {

          if (pageController.currentPage >0)

           {

              int witch =pageController.currentPage -1;

               [scrollsetContentOffset:CGPointMake(witch*310,0)animated:YES];

              pageController.currentPage -- ;

           }

       }

    }

}


@end

此处完-->下一节预习:答题页面UIPageViewController的转化以及代理


原创粉丝点击