事前准备:
1. 准备 UIPageControl 显示需要的两种图片
2. 准备 UIimageView 显示需要的图片,本例 使用了 5张
代码如下:
#import "ViewController.h"
@interface ViewController () <UIScrollViewDelegate>
// 自定义声明照片张数
@property (assign,nonatomic)NSInteger *count;
/** 定义页码*/
@property (nonatomic,weak)UIPageControl *page;
/** scrollView*/
@property (nonatomic,weak)UIScrollView *scrollView;
/** 定时器*/
@property (nonatomic,weak)NSTimer *timer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 创建scrollView
[self buildScrollView];
}
-(void)buildScrollView {
#pragma mark 创建UIScrollView
UIScrollView *scrollView = [[UIScrollView alloc]init];
scrollView.frame = CGRectMake(30, 100, 300, 180);
scrollView.backgroundColor = [UIColor redColor];
// 给全局变量赋值
self.scrollView = scrollView;
[self.view addSubview:scrollView];
//定义照片张数
NSInteger count = 5;
// 遍历创建imageView 并添加图片
for (int i = 0; i < count; i ++) {
#pragma mark 计算imageView 中 x 值位置,并创建
CGFloat x = scrollView.frame.size.width * (i % count);
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(x, 0,scrollView.frame.size.width, scrollView.frame.size.height)];
// 获取图片名称
NSString *name = [NSString stringWithFormat:@"img_0%i",i + 1];
//设置图片
imageView.image = [UIImage imageNamed:name];
//设置图片模式,填充满imageView
imageView.contentMode = UIViewContentModeScaleToFill;
[scrollView addSubview:imageView];
}
//设置 scrollView 的滚动范围
scrollView.contentSize = CGSizeMake(count * scrollView.frame.size.width, 0);
// 开启分页功能
// 标准:以scrollView的尺寸为一页
scrollView.pagingEnabled = YES;
#pragma mark 创建UIPageControl
UIPageControl *page = [[UIPageControl alloc]init];
// 给全局变量赋值
self.page = page;
page.frame = CGRectMake(190, 230, 90, 30);
//设置总页数 ,注意不要写死;
page.numberOfPages = count;
#pragma mark 使用kvc 赋值,注意:这是UIPageControl 中的内部属性,在xcode7之前是可见的,注意path路径不要写错
[page setValue:[UIImage imageNamed:@"current"] forKeyPath:@"_currentPageImage"];
[page setValue:[UIImage imageNamed:@"other"] forKeyPath:@"_pageImage"];
[self.view addSubview:page];
// 页码 的滚动 需要设置代理,调用代理方法
scrollView.delegate = self;
//创建定时器
self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextpage) userInfo:nil repeats:YES];
#pragma mark 修改定时器在主线程中的模式
// 修改定时器在主线程中的模式 NSDefaultRunLoopMode 改为 NSRunLoopCommonModes 让主线程分配时间,
// NSDefaultRunLoopMode默认模式下.主线程同一时间只会处理一个事物
// NSRunLoopCommonModes 同一时间可以分配时间处理其他事物
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
// 定时器调用的方法,滚动到下一页
-(void)nextpage {
// 计算下一页的页码
NSInteger i = (int)(self.scrollView.contentOffset.x / self.scrollView.frame.size.width) + 1 ;
//如果页码数为 5 ,返回第一页
if (i == 5) {
i = 0;
}
// 将 scrollView 的内容滚动到对应页码图片
[self.scrollView setContentOffset:CGPointMake(i * self.scrollView.frame.size.width, 0) animated:YES];
// 设置UIPageControl的当前页码
self.page.currentPage = i;
}
// 代理方法
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if (decelerate == 0) {
[self disletPage];
}
}
//代理方法
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
[self disletPage];
}
//计算页码
-(void)disletPage {
// 计算页码
NSInteger pages = (int) (self.scrollView.contentOffset.x / self.scrollView.bounds.size.width + 0.5);
//设置当前页码
self.page.currentPage = pages;
// 如果 页码数为 4,则设置返回第一页
if (pages == 4) {
pages = 0;
// 延迟 2.0s 调用方法
[self performSelector:@selector(play) withObject:nil afterDelay:2.0];
}
}
// 延迟调用的方法
-(void)play{
self.page.currentPage = 0;
[self.scrollView setContentOffset:CGPointMake(0 , 0) animated:YES];
}
// 开始减速停止定时器
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
[self.timer invalidate];
}
// 即将停止拖拽.开启定时器
-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextpage) userInfo:nil repeats:YES];
}
@end
浙公网安备 33010602011771号