在iOS开始中,我们会使用到一些定时器来帮我们实现一个定时操作的效果,这个时候我们就可以使用NSTimer这个类来实现该效果。
举一个案例,图片轮播器,一般会在一些网购的APP使用该效果来轮循播放广告图片。
一般需要使用到的组件就是UIScrollView就行了,将要显示的图片加载进来,然后设置UIScrollView的分页效果为YES。
下面就是实现该效果的步骤
1,搭建界面
程序的主界面中有三个控件
* UIScrollView 图片轮播器,实现1组图片幻灯片的效果播放
* UIPageControl 提示图片播放到了第几张
* UITextView 主要来测试应用程序隐藏的bug
2,实现图片轮播的效果
步骤:
2.1,首先是将要进行播放的一组图片添加到UIScrollView,计算出UIScrollView的
contentSize的值
//1
,添加图片
CGFloat imageW = self . scrollView . frame . size . width ;
CGFloat imageH = self . scrollView . frame . size . height ;
CGFloat imageY = 0 ;
for ( int index = 0 ; index < MJImageCount ; index++ ) {
// 计算出每一张图片的显示的 X 轴上的值
CGFloat imageX = imageW * index;
UIImageView * imageView = [[ UIImageView alloc ] initWithFrame : CGRectMake (imageX, imageY, imageW, imageH)];
imageView. image = [ UIImage imageNamed :[ NSString stringWithFormat : @"img_0%d" ,index+ 1 ]];
[ self . scrollView addSubview :imageView];
}
//2 ,设置 UIScrollView 显示的大小
CGFloat contentW = imageW * MJImageCount ;
CGFloat imageW = self . scrollView . frame . size . width ;
CGFloat imageH = self . scrollView . frame . size . height ;
CGFloat imageY = 0 ;
for ( int index = 0 ; index < MJImageCount ; index++ ) {
// 计算出每一张图片的显示的 X 轴上的值
CGFloat imageX = imageW * index;
UIImageView * imageView = [[ UIImageView alloc ] initWithFrame : CGRectMake (imageX, imageY, imageW, imageH)];
imageView. image = [ UIImage imageNamed :[ NSString stringWithFormat : @"img_0%d" ,index+ 1 ]];
[ self . scrollView addSubview :imageView];
}
//2 ,设置 UIScrollView 显示的大小
CGFloat contentW = imageW * MJImageCount ;
self.scrollView.contentSize = CGSizeMake(contentW, 0);
2.2,隐藏滚动条,并开启分页的效果
//3
,隐藏水平滚动条和开启分页的效果
self . scrollView . showsHorizontalScrollIndicator = NO ;
self . scrollView . showsHorizontalScrollIndicator = NO ;
self.scrollView.pagingEnabled = YES;
//4
,设置
UIPageController
的页数
self . pageControl . numberOfPages = MJImageCount ;
//5 ,添加定时器
self . pageControl . numberOfPages = MJImageCount ;
//5 ,添加定时器
[self addTimer];
//
添加定时器
-(void)addTimer{
self
.
timer
= [
NSTimer
scheduledTimerWithTimeInterval
:
2.0
target
:
self
selector
:
@selector
(nextImage)
userInfo
:
nil
repeats
:
YES
];
[[ NSRunLoop currentRunLoop ] addTimer : self . timer forMode : NSRunLoopCommonModes ];
[[ NSRunLoop currentRunLoop ] addTimer : self . timer forMode : NSRunLoopCommonModes ];
}
//
移除定时器
/**
通过 invalidate 方法可以停止定时器的工作,一旦定时器被停止了,就不能再次执行任务。
只能再创建一个新的定时器才能执行新的任务
*/
-( void )removeTimer{
[ self . timer invalidate ];
self . timer = nil ;
/**
通过 invalidate 方法可以停止定时器的工作,一旦定时器被停止了,就不能再次执行任务。
只能再创建一个新的定时器才能执行新的任务
*/
-( void )removeTimer{
[ self . timer invalidate ];
self . timer = nil ;
}
3,解决一些细小的bug
情景一:如果用户按住了UIScrollView这个控件,那么,按理来说这个组件是不会拖动的,但是由于定时器的原因,这个索引还是一直在增加的
#pragma mark
当开始拖拽滚动面板就调用
-( void )scrollViewWillBeginDragging:( UIScrollView *)scrollView{
[ self removeTimer];
}
#pragma mark 正在拖拽滚动面板的时候就调用
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
// 根据scrollView的滚动位置决定pageControl显示第几页
CGFloat scrollW = scrollView.frame.size.width;
int page = (scrollView.contentOffset.x + scrollW * 0.5) / scrollW;
self.pageControl.currentPage = page;
}
#pragma mark 当停止拖拽滚动面板就调用
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
[selfaddTimer];
-( void )scrollViewWillBeginDragging:( UIScrollView *)scrollView{
[ self removeTimer];
}
#pragma mark 正在拖拽滚动面板的时候就调用
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
// 根据scrollView的滚动位置决定pageControl显示第几页
CGFloat scrollW = scrollView.frame.size.width;
int page = (scrollView.contentOffset.x + scrollW * 0.5) / scrollW;
self.pageControl.currentPage = page;
}
#pragma mark 当停止拖拽滚动面板就调用
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
[selfaddTimer];
}
•NSTimer叫做“定时器”,它的作用如下
Ø在指定的时间执行指定的任务
Ø每隔一段时间执行指定的任务
Ø
•调用下面的方法就会开启一个定时任务
+ (NSTimer*)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)yesOrNo;
每隔ti秒,调用一次aTarget的aSelector方法,yesOrNo决定了是否重复执行这个任务
•通过invalidate方法可以停止定时器的工作,一旦定时器被停止了,就不能再次执行任务。只能再创建一个新的定时器才能执行新的任务
- (void)invalidate;
以上的内容有部分是参考网上资源编写的。