1 #import "ViewController.h"
2
3 @interface ViewController () <UIScrollViewDelegate>
4
5 @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
6 @property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
7
8 @property (weak,nonatomic) NSTimer *timer;
9
10 @end
11 /**
12 * View的代理属性都是weak的,否则就会循环强引用,导致内存泄露
13 */
14 @implementation ViewController
15
16 //当控制器上得View已被加载完毕就会执行这个方法
17 - (void)viewDidLoad {
18 [super viewDidLoad];
19
20 // 把美女视图添加到scrollView中
21
22 // 取出scrollView的frame
23 CGRect frame = self.scrollView.frame;
24 // 定义变量记录多少张图片
25 int numOfImages = 8;
26
27 for (int i = 0; i < numOfImages; ++i) {
28
29 // 创建UIImageView
30 UIImageView *imageView = [[UIImageView alloc] init];
31 // 添加到scrollView中
32 [self.scrollView addSubview:imageView];
33 // 给imageView设置图片
34 // 拼接图片名称
35 NSString *imageName = [NSString stringWithFormat:@"%02d",i+1];
36 // 设置图片
37 imageView.image = [UIImage imageNamed:imageName];
38 // 取出scrollView的frame(共用代码移到外边)
39 // CGRect frame = self.scrollView.frame;
40 // 计算imageView的x坐标
41 frame.origin.x = frame.size.width * i;
42 // 设置imageViewframe
43 imageView.frame = frame;
44
45 }
46
47 // 设置scrollView的contentSize
48 // 0表示支持垂直方向的滚动
49 self.scrollView.contentSize = CGSizeMake(frame.size.width * numOfImages, 0);
50
51 // 设置支持分页
52 self.scrollView.pagingEnabled = YES;
53 // 去掉水平的滚动条
54 self.scrollView.showsHorizontalScrollIndicator = NO;
55
56 // 设置控制为scrollView代理
57 self.scrollView.delegate = self;
58
59 // 开始轮播
60 [self startTimer];
61 }
62
63
64 - (void) nextImage
65 {
66 // 调试输出的关键字__func__ 等价于 __FUNCTION__
67 // -[ViewController nextImage] -表示对象方法 ViewController 是哪个类的 nextImage是哪个方法
68 // NSLog(@"%s",__FUNCTION__);
69
70 // 1.获取当前页
71 NSInteger page = self.pageControl.currentPage;
72 // 2.计算下一页
73 if (page == self.pageControl.numberOfPages - 1) {
74 page = 0;
75 }else{
76 page++;
77 }
78
79 [UIView animateWithDuration:1 animations:^{
80
81 // 3.让scrollView滚到下一页
82 self.scrollView.contentOffset = CGPointMake(page * self.scrollView.frame.size.width, 0);
83
84 }];
85
86 }
87
88 //开启一个全新的定时器
89 - (void) startTimer
90 {
91 // 定时器
92 // scheduled 调度(执行)
93 // Interval 间隔的时间 (s)
94 // target 目标(调用谁的方法)
95 // selector 方法(调用哪一个方法)
96 // repeats 是否需要重复执行
97 // 做了两件事 1.创建NSTimer的对象
98 // 2。把这个NSTimer以默认形式添加到了主运行循环中 (默认优先级低于事件处理的优先级)
99 // self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
100
101 // 1.创建NSTimer对象
102 NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
103 // 2.添加到主运行循环中
104 // Run 运行 Loop 循环
105 // NSDefaultRunLoopMode 默认模式(低于事件处理优先级)
106 // NSRunLoopCommonModes 通用模式 (于事件处理的优先级相同)
107 [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
108
109 // 3.记录当前的timer
110 self.timer = timer;
111 }
112
113
114 #pragma mark - 代理方法
115 /**
116 * 当用户即将拽住scrollView的时候执行这个
117 */
118 - (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView
119 {
120 // 停止定时器
121 // 让定时器失效,一旦失效就不能在使用了。
122 [self.timer invalidate];
123 }
124 /**
125 * 当用户的手指从scrollViwew上抬起的时候执行这个方法
126 */
127 - (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
128 {
129 // 重新开始调度
130 [self startTimer];
131
132 }
133
134 //当scrollView的contentOffset发生改变都会调用该方法
135 - (void)scrollViewDidScroll:(UIScrollView *)scrollView
136 {
137
138 // round 函数可以进行四舍五入
139 int page = round(scrollView.contentOffset.x / scrollView.frame.size.width) ;
140
141 self.pageControl.currentPage = page;
142 }
143
144 @end