文章标题小型图片轮播器

//
// HYViewController.m
// 03-轮播器
//
// Created by apple on 15-4-19.
// Copyright (c) 2015年 apple. All rights reserved.
//

#import "HYViewController.h"
#define HYpageCount 5
@interface HYViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
/** 定时器属性*/
@property(nonatomic,strong) NSTimer *timer;
@end


@implementation HYViewController

/** 控制器的view加载完毕的时候调用*/
- (void)viewDidLoad
{
    [super viewDidLoad];


    CGFloat imageW=self.scrollView.frame.size.width;
    CGFloat imageH=self.scrollView.frame.size.height;
    CGFloat imageY=0;

    for(int i=0;i<HYpageCount;i++)
    {
        //1.建立UIImageView控件
        UIImageView *imageView=[[UIImageView alloc]init];

        //2. 设置图片
        NSString *name=[NSString stringWithFormat:@"img_0%d",i+1];
        imageView.image =[UIImage imageNamed:name];

        //3.设置frame
        CGFloat imageX= i*imageW;
              imageView.frame=CGRectMake(imageX, imageY, imageW, imageH);
        [self.scrollView addSubview:imageView];
    }

     //4. 设置滚动的范围
    self.scrollView.contentSize=CGSizeMake(HYpageCount*imageW, 0);

    //5.隐藏水平滚动条
    self.scrollView.showsHorizontalScrollIndicator=NO;

    //是否分页
    self.scrollView.pagingEnabled=YES;

    //6.添加分页按钮
    self.pageControl.numberOfPages=HYpageCount;

    //7.设置代理
    self.scrollView.delegate=self;

    //8. 添加定时器 (每隔两秒就调用一次self的nextPage方法)
    [self addTimer];




}

/** 添加定时器*/
-(void)addTimer
{
    //self.timer保存一下
    self.timer= [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
}

//当用户执行其余操做时,让定时器优先级高点,执行定时器操做
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];


/** 移除定时器*/
-(void)removeTimer
{
    [self.timer invalidate ];
    self.timer=nil;
}

/** 当用户开始拖拽的时候调用*/
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    //中止定时器,中止以后,此刻的定时器不能用了
    [self removeTimer];
}

/** 用户彻底中止拖拽的时候调用*/
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    //以前在拖拽的时候,定时器不能再用了,这个时候,咱们要从新建立定时器
    [self addTimer];
}


/* 我的理解: 这个方法有个问题:就是存在两个点之间来回调动的问题, 问题缘由:先 self.pageControl.currentPage++; 点会跳到下一个,而后设置contentOffset以后,会调用 scrollViewDidScroll方法(当scrollview正在滚动的时候就会调用),由于设置contentOffset有动画,那么它的contentoffset 是慢慢增长的, int page=self.scrollView.contentOffset.x/scrollW page应该是等于0;那个点又从下一个跳回来了,当contentoffset够一个宽度的时候,又会往下跳。 */
//-(void)nextPage
//{
// if(self.pageControl.currentPage==HYpageCount-1) //最后一页,就让它变为第0页
// {
// self.pageControl.currentPage=0;
// }
// else
// {
// self.pageControl.currentPage++;
// }
// 
// CGFloat offsetW=self.scrollView.frame.size.width;
// CGFloat offsetX=self.pageControl.currentPage*offsetW;
// CGPoint offset=CGPointMake(offsetX, 0);
// //设置contenOffset ,并且须要动画YES,就调用这个方法setContentOffset:animated:
// [self.scrollView setContentOffset:offset animated:YES];
//}

/** 上面的问题解决方法*/
-(void)nextPage
{
    int page=0;
    if(self.pageControl.currentPage==HYpageCount-1) //最后一页,就让它变为第0页
    {
        page=0;
    }
    else
    {
        //当前页数加1;
        page=self.pageControl.currentPage+1;
    }

    CGFloat offsetW=self.scrollView.frame.size.width;
    CGFloat offsetX=page*offsetW;
    CGPoint offset=CGPointMake(offsetX, 0);
    //设置contenOffset ,并且须要动画YES,就调用这个方法setContentOffset:animated:
    [self.scrollView setContentOffset:offset animated:YES];
}


#pragma mark -代理方法
/** * 当scrollview正在滚动的时候就会调用 * *  @param scrollView */
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //根据UIScrollView的滚动位置,来显示当前是第几页,也就是设置currentPage
    CGFloat scrollW=self.scrollView.frame.size.width;
    int page=self.scrollView.contentOffset.x/scrollW; //显示的页数 最好加上一半的宽度

    self.pageControl.currentPage=page;
}
@end

!当出现两个点来回切换的问题的解决方案

!当用户用手拖拽的时候,中止后,加速跑动的问题

java

相关文章
相关标签/搜索