文章标题小型图片轮播器

//
//  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


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

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

转载于:https://www.cnblogs.com/shy1015/p/4512918.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值