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