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就可以自动滚动了。
虽然可以自动滚动了,但是不会循环滚动,接下来就研究一下循环滚动的方法。
本文来自博客园,作者:struggle_time,转载请注明原文链接:https://www.cnblogs.com/songliquan/p/4544640.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?