supersr--图片轮播逻辑
//
// ViewController.m
// 图片轮播
//
// Created by apple on 14-5-18.
// Copyright (c) 2014年 All rights reserved.
//
#import "ViewController.h"
@interface ViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
/**
* 定义属性来记录当前NSTimer对象
*/
@property (nonatomic, strong) NSTimer *timer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 1.向scrollView中添加图片
// 取出scrollView的size
CGSize scrollSize = self.scrollView.frame.size;
for (int i = 0; i < 5; i++) {
UIImageView *imageView = [[UIImageView alloc] init];
CGFloat scrollWidth = scrollSize.width;
CGFloat imageX = scrollWidth * i;
CGFloat imageY = 0;
CGFloat imageW = scrollWidth;
CGFloat imageH = scrollSize.height;
imageView.frame = CGRectMake(imageX, imageY, imageW, imageH);
NSString *imageName = [NSString stringWithFormat:@"img_%02d",i+1];
imageView.image = [UIImage imageNamed:imageName];
[self.scrollView addSubview:imageView];
}
// 2.设置contentSize
// 不支持竖直滚动就高度设置为0
self.scrollView.contentSize = CGSizeMake(scrollSize.width * 5, 0);
// 出现分页效果,YES表示有分页效果,NO 没有分页效果,默认NO
self.scrollView.pagingEnabled = YES;
// 去掉水平滚动条
self.scrollView.showsHorizontalScrollIndicator = NO;
// 让控制器成为scrollView的代理
// 设置scrollView的代理为self
self.scrollView.delegate = self;
#pragma mark - 自动轮播代码开始
/*
// 创建定时器
// NSTimeInterval 时间间隔 单位s
// 调用target这对象的selector方法
// userInfo 数据,如果不需要就设置为nil
// repeats 是否重复执行这个方法,YES表示重复执行
NSTimer *timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
// 添加到运行循环中
// NSRunLoopCommonModes 与处理用户事件处于同一个级别
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
// 1.创建NSTimer对象
// 2.把这个NSTimer添加主运行循环中以NSDefaultRunLoopMode的模式
// self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
*/
[self startTimer];
}
- (void) startTimer
{
self.timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
// 添加到运行循环中
// NSRunLoopCommonModes 与处理用户事件处于同一个级别
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
- (void) nextPage
{
NSLog(@"%s",__func__);
// 获取当前也
NSInteger currentPage = self.pageControl.currentPage;
// 计算下一页
NSInteger nextPage = -1;
if (currentPage == self.pageControl.numberOfPages - 1) {
nextPage = 0;
}else{
nextPage = currentPage+1;
}
// 计算contentOffsetX的值
CGFloat contextOffsetX = nextPage * self.scrollView.frame.size.width;
[UIView animateWithDuration:1 animations:^{
self.scrollView.contentOffset = CGPointMake(contextOffsetX, 0);
}];
}
#pragma mark scrollView的代理方法
// 当用户拽住scrollView中内容时候会执行这个方法
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
// invalidate 让定时器失效
// 如果调用这个方法,就能再次使用了
[self.timer invalidate];
}
// 当用户已经停止拖拽了(当用户手从界面抬起的时候)
- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
// 创建一个新NSTimer的对象
// 1.创建NSTimer对象
// 2.把这个NSTimer添加主运行循环中以NSDefaultRunLoopMode的模式
// self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
[self startTimer];
}
// 监听scrollView的滚动过程
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// 获取滚动位置的x坐标
CGFloat offsetX = scrollView.contentOffset.x;
// 计算当前是第几页
// round(double) 四舍五入
CGFloat page = round(offsetX / scrollView.frame.size.width);
// NSLog(@"%lf",page);
if (page != self.pageControl.currentPage) {
// current 当前的
self.pageControl.currentPage = page;
}
// self.pageControl.numberOfPages 用于设置一共有多少页的
}