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
时间: 2024-12-17 15:48:30