IOS开发学习笔记035-UIScrollView-自动滚动

让图片自动滚动的话,需要使使用定时器,循环计算当前页的页码。并且在拖动图片时停止计时器,停止拖动时启动计时器。

 

定时器

  • 方法1: performSelector 
1     [self performSelector:@selector(hideHUD) withObject:nil afterDelay:2.0];
2     - (void)hideHUD
3     {
4         _hudLable.hidden = YES;
5     }
  • 方法2: GCD
1     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)),
2                 dispatch_get_main_queue(), ^{
3         _hudLable.hidden = YES;
4     });
  • 方法3: scheduledTimerWithTimeInterval
1     [NSTimer scheduledTimerWithTimeInterval:3.0
2         target:self selector:@selector(hideHUD) userInfo:nil repeats:NO];

 

  • 方法4:timerWithTimeInterval
复制代码
 1     // 1 创建定时器,由系统控制其生命周期
 2     [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
 3     // 2 创建定时器,不过是局部变量
 4     //NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
 5     // 手动启动定时器
 6     //[timer fire];
 7 
 8     - (void)nextPage
 9     {
10         NSLog(@"nextPage:%ld", self.pageControl.currentPage);
11 
12     }
复制代码
  • 设置定时器线程的优先级
1 - (void)startTimer
2 {
3     //  创建定时器
4     self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
5     // 设置计时器线程的优先级和其他线程一样
6     [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
7 }

 

代码实现

  1、添加计时器属性

1 @property (strong, nonatomic ) NSTimer *timer; //计时器

  2、在初始化完毕xib界面后,开启定时器

1 // xib 初始化完毕会调用这个方法
2 - (void)awakeFromNib
3 {
4    // NSLog(@"awakeFromNib-----");
5     
6     // 开启定时器
7     [self startTimer];
8

  3、startTimer方法实现:创建定时器

1 - (void)startTimer
2 {
3     //  创建定时器
4     self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
5     // 设置计时器线程的优先级和其他线程一样
6     [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
7 }

  4、实现nextPage方法,滚动到下一个界面

复制代码
 1 - (void)nextPage
 2 {
 3     NSLog(@"nextPage---");
 4     // 下一个页面,对总数取余的页码,循环滚动
 5     NSInteger page = (self.pageControl.currentPage + 1) % self.scrollView.subviews.count;
 6     // 计算偏移量,索引值和scrollView宽度的积
 7     CGPoint offset = CGPointMake(page * self.scrollView.frame.size.width, 0);
 8     // 设置新的偏移量
 9     [self.scrollView setContentOffset:offset animated:YES];
10 }
复制代码

  5、实现代理方法<UIScrollViewDelegate>:拖动状态

复制代码
 1 #pragma mark - 定时器
 2 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
 3 {
 4     // 没有拖动图片就开始定时器
 5     [self startTimer];
 6 }
 7 
 8 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
 9 {
10     // 一旦开始拖动就停止计时器
11     [self stopTimer];
12 }
复制代码

  6、停止和启动定时器方法

复制代码
 1 - (void)startTimer
 2 {
 3     //  创建定时器
 4     self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
 5     // 设置计时器线程的优先级和其他线程一样
 6     [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
 7 }
 8 
 9 
10 - (void)stopTimer
11 {
12     [self.timer invalidate]; // 停止计时器
13     self.timer = nil; //清空指针
14 }
复制代码

 

以上步骤结束,scrollView就可以自动滚动了。

 

虽然可以自动滚动了,但是不会循环滚动,接下来就研究一下循环滚动的方法。

 

posted @   struggle_time  阅读(1359)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示