思路:

1.创建一个单例

+ (instancetype)shareManager {static CCPaomaView *pModel = nil;static dispatch_once_t once;dispatch_once(&once, ^{pModel = [[CCPaomaView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, 0.0468 *KScreenHeight)];});return pModel;
}

2.使用 FMDB,把接收的数据存在本地的 sqlite,每次取一个数据,动画执行完删除当前数据,再取下一条数据

3.根据动画代理,监听动画执行结束,将动画实例置为 nil

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{NSLog(@"stopAnimation:%@",[self.paomaLabel.layer animationForKey:@"paoMaDeng"]);// 记录运行的动画的时间_pmAniamtion.timeOffset = anim.timeOffset;// 如果回到前台NSString *backStr = [_defaults objectForKey:@"isBack"];if ([backStr intValue] == 0) {if ([self.paomaLabel.layer animationForKey:@"paoMaDeng"] == anim) {[_timer invalidate];_timer = nil;// 动画停止之后,将实例置为 nil_pmAniamtion = nil;CCPaomaModel *model = [[CCPaomaModel alloc]init];// 删除第一个数据[model deleteRow:_array[0]];// 重新再取一次数据(一个)_array = [model selectTable];// 数组为空之后移除跑马灯if (_array.count > 0) {[self showPaomaView:self.superview];}else{self.hidden = YES;[self removeFromSuperview];}NSLog(@"%@",self.array);}}else{// 暂停定时器
        [_timer setFireDate:[NSDate distantFuture]];}
}

4.判断动画实例是否为空,使得切换界面,跑马灯继续,而不是重新开始

- (void)paomaAniamtion:(CGFloat)count{//判断动画实例存不存在,存在继续,不存在即创建if (_pmAniamtion == nil) {_pmAniamtion = [CABasicAnimation animation];_pmAniamtion.keyPath = @"transform.translation.x";CGFloat W = CGRectGetWidth(_paomaLabel.bounds);_pmAniamtion.fromValue = @(W);_pmAniamtion.toValue = @(-W);_pmAniamtion.duration = _aniTime;_pmAniamtion.repeatCount = count;_pmAniamtion.removedOnCompletion = NO;       //动画结束不移除_pmAniamtion.fillMode = kCAFillModeForwards; //动画结束会保持结束的状态_pmAniamtion.delegate = self;                //设置代理[_paomaLabel.layer addAnimation:_pmAniamtion forKey:@"paoMaDeng"];}else{_pmAniamtion.repeatCount = count;}
}

5.切换界面,暂停、恢复动画

- (void)viewWillAppear:(BOOL)animated {[_paomaView resumeAnimation];if (_paomaView.hidden == YES) {[_paomaView showPaomaView:self.view];}if (_paomaView.array.count > 0) {[self.view addSubview:_paomaView];}
}- (void)viewWillDisappear:(BOOL)animated {[_paomaView pauseAnimation];[_paomaView.timer invalidate];_paomaView.timer = nil;
}

6.记录回到后台,判断是否执行添加动画方法

- (void)resumeAnimation
{if (_array.count > 0) {CFTimeInterval pausedTime = [_paomaLabel.layer timeOffset];_paomaLabel.layer.speed = 1.0;_paomaLabel.layer.timeOffset = 0.0;_paomaLabel.layer.beginTime = 0.0;CFTimeInterval timeSincePause = [_paomaLabel.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;_paomaLabel.layer.beginTime = timeSincePause;// 是否进入后台_defaults = [NSUserDefaults standardUserDefaults];NSString *backStr = [_defaults objectForKey:@"isBack"];if ([backStr intValue] == 1) {// 开启定时器
            [_timer setFireDate:[NSDate distantPast]];int anmationCount = [_array[2] intValue];NSLog(@"恢复之后的次数:%d",anmationCount);if (anmationCount > 0) {_pmAniamtion.repeatCount = anmationCount;[_paomaLabel.layer addAnimation:_pmAniamtion forKey:@"paoMaDeng"];}[_defaults setObject:@"0" forKey:@"isBack"];}}
}

话不多说,github 见代码 ( https://github.com/slodier/CCScoops ),觉得好给个 star 呗

转载注明出处: http://www.cnblogs.com/asamu/p/5976557.html

转载于:https://www.cnblogs.com/asamu/p/5976557.html

iOS 学习 - 24.全局跑马灯,支持后台回到前台相关推荐

  1. 参考学习的各种跑马灯代码

    实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入"<marquee>滚动的文字</marquee>"语句, ...

  2. iOS 雪花动画与跑马灯

    这篇是接着上一篇, 关于动画效果的收集篇, 这篇介绍了跑马灯动画以及下落雪花动画, 请看, 话说最近怎么不在状态呢, 好伤感(囧~). 上一篇 - iOS 仿YY直播心形动画 & 烟花动画 跑 ...

  3. 学习笔记——LED跑马灯

    目录 一.任务简述 二.实现方法 三.参考代码 一.任务简述 在CT107D单片机上实现LED的基本控制,首先让8路LED指示灯闪烁3遍后熄灭,接着依次点亮LED指示灯,最后依次熄灭指示灯,程序循环实 ...

  4. 小米9 从后台回到前台后 Dialog不显示 只有半透明的背景

    最近用自定义Dialog 展示一些提示语,用小米测试时发现在弹出DialogAPP恰好在后台时,再次打开APP,界面上没有 DIalog 的弹框,但是有半透明的背景,点击返回也关不掉,只有关闭页面才会 ...

  5. iOS LED跑马灯效果实现

    iOS中实现LED跑马灯效果 实现原理是使用scrollView, 将需要滚动的label添加两次到 scrollView的subView下面, 然后通过滚动scrollView来实现跑马灯效果. 具 ...

  6. 【iOS_GitHub】跑马灯/滚动文字条(类似于菜鸟/京东/支付宝/聚划算/网商银行等app的跑马灯功能)

    Marquee(跑马灯) 说一下初衷吧,最初要用到跑马灯功能的时候,也找过一些SDK,但未能找到与我需求很好契合的SDK,主要就是手势滑动后的问题(手势滑动push/pop || 前后台切换等时候跑马 ...

  7. STM32(1)跑马灯

    建立LED初始化头文件 建立头文件有点像C++中,头文件中可以添加宏定义以及函数原型,然后在.c文件中写入函数定义 "sys.h" "sys.h"这个头文件中# ...

  8. 51单片机C语言跑马灯,51单片机上实现控制跑马灯

    在MCS一51单片机的控制系统中,它的四个并行8位输入输出端口P0一P3是我们经常使用的.在并行端口的编程学习中,"跑马灯"是单片机并行端口输出控制的典型实例.所谓跑马灯,是指将八 ...

  9. 单片机跑马灯程序c语言,MCS-51单片机控制跑马灯的三种方法

    描述 在MCS一51单片机的控制系统中,它的四个并行8位输入输出端口P0一P3是我们经常使用的.在并行端口的编程学习中,"跑马灯"是单片机并行端口输出控制的典型实例.所谓跑马灯,是 ...

  10. android如何监听应用进入后台,回到前台时做相应逻辑

    当我们使用手机银行app时,突然收到短信或电话时app会进入后台,再次回到手机银行界面的时候会被要求重新输入登陆密码或验证指纹,这一需求的设计主要是出于安全性考虑,验证用户身份,保证资金的稳固.    ...

最新文章

  1. NIPS2020 | DiffGCN:利用微分算子和代数多重网格池化优化图卷积
  2. Android开发之EditText无法获取光标的问题
  3. 疫情与资本寒冬双重危机下,智领云为何能拿到数千万融资?
  4. 书籍《智能交通》-观后感-2021年12月-下期分享
  5. 阿里云 ssh 登陆请使用(公)ip
  6. ffplay播放器原理学习
  7. NRF24L01无线通信模块使用示例和调试心得总结
  8. ESP8266 WIFI模块开发入门1 开发环境搭建
  9. 什么软件可以测试睡眠质量心率,Beddit:粘在床上就能测试心率的睡眠监测器
  10. 使用Fiddler修改百度的Logo
  11. java 支付宝支付 demo_java开发支付宝支付详细流程_demo的运行
  12. 标准时间格式与时间戳的转化
  13. 戴尔笔记本电脑的计算机配置在哪,戴尔g3怎么查电脑配置
  14. gan 的要点 (弱点与改进、推土距离)
  15. exe反编译NET逆向
  16. 手机使用打印机打印方法须知
  17. 实验十一 .实验十二
  18. 国内厂商:苹果胜诉高通太难 不过或能减少专利费
  19. mysql适合储存高清电影的数据类型_下列数据类型中适合存储PDF文档的是( ) (5.0分)_学小易找答案...
  20. 用python合并多个ppt_Python合并PPT

热门文章

  1. NYOJ 972(蓝桥杯) 核桃的数量
  2. 用python写的游戏有哪些_想用Python写个小游戏?这个项目里有21个例子
  3. 【学习笔记】multiset+multimap之equal_range、upper_bound、lower_bound、count
  4. 【C++:类和对象】处理一个线性表,动态产生线性存储空间,并实现线性表的部分操作
  5. php使用switch语句编写程序,PHP控制语句之“switch”语句实例详解
  6. SVM支持向量和逻辑回归的decision_function用法详解
  7. css移动端页面单位,视窗单位在移动端上的使用技巧
  8. java实例化全局变量_静态/全局变量的内存隔离(多实例化)
  9. C/C++[codeup 2066]分组统计
  10. 容器技术Docker K8s 21 容器服务ACK基础与进阶-存储管理