思路:

1.创建一个单例

+ (instancetype)shareManager {
static CCPaomaView *pModel = nil;
static dispatch_once_t once;
dispatch_once(&once, ^{
pModel = [[CCPaomaView alloc]initWithFrame:CGRectMake(, , 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] == ) {
if ([self.paomaLabel.layer animationForKey:@"paoMaDeng"] == anim) { [_timer invalidate];
_timer = nil; // 动画停止之后,将实例置为 nil
_pmAniamtion = nil; CCPaomaModel *model = [[CCPaomaModel alloc]init];
// 删除第一个数据
[model deleteRow:_array[]];
// 重新再取一次数据(一个)
_array = [model selectTable]; // 数组为空之后移除跑马灯
if (_array.count > ) {
[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 > ) {
[self.view addSubview:_paomaView];
}
} - (void)viewWillDisappear:(BOOL)animated {
[_paomaView pauseAnimation]; [_paomaView.timer invalidate];
_paomaView.timer = nil;
}

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

- (void)resumeAnimation
{
if (_array.count > ) {
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] == ) { // 开启定时器
[_timer setFireDate:[NSDate distantPast]]; int anmationCount = [_array[] intValue];
NSLog(@"恢复之后的次数:%d",anmationCount);
if (anmationCount > ) {
_pmAniamtion.repeatCount = anmationCount;
[_paomaLabel.layer addAnimation:_pmAniamtion forKey:@"paoMaDeng"];
}
[_defaults setObject:@"" forKey:@"isBack"];
}
}
}

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

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

iOS 学习 - 24 全局跑马灯,支持后台回到前台的更多相关文章

  1. Android判断应用程序从后台回到前台

    MainActivity如下: package cc.testbackgroundtofront; import java.util.List; import android.app.Activity ...

  2. Android学习总结——TextView跑马灯效果

    Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize="marquee" 2.TextView必须单行显示,即内容必须 ...

  3. iOS学习24之UIControl及其子类

    1. UIControl初识 1> 概述 UIControl是有控制功能的视图( 如UIButton.UISlider.UISegmentedControl等)的父类 只要跟控制有关的控件都是继 ...

  4. 【IOS】自定义可点击的多文本跑马灯YFRollingLabel

    需求 项目中需要用到跑马灯来仅展示一条消息,长度合适则不滚动,过长则循环滚动. 虽然不是我写的,但看了看代码,是在一个UIView里面放入两个UILabel, 在前一个快结束的时候,另一个显示.然而点 ...

  5. android中实现跑马灯效果以及AutoCompleteTestView与MultiAutoCompleteTextView的学习

    跑马灯效果 1.用过属性的方式实现跑马灯效果 属性:                  android:singleLine="true" 这个属性是设置TextView文本中文字 ...

  6. iOS 跑马灯带图片可点击

    项目中有个需求,需要以跑马灯的形势滚动展示用户的实时数据,跑马灯需要有用户头像,内容的长度不固定,并且可以点击,滚动效果还要足够流畅,本着不重复造轮子的心理,在网上各种搜索,发现都没法找到满足需求的d ...

  7. iOS swift跑马灯滚动可以点击

    跑马灯,从右至左循环滚动显示信息,并且支持点击事件,使用swift4.0语法完成,更加简介,通用性强,布局部分全部使用snpkit 代码: // // HXQMarqueeView.swift // ...

  8. IOS跑马灯效果,实现文字水平无间断滚动

    ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController{ NSTimer ...

  9. Third Day:正式编程第三天,学习实践内容TextView跑马灯、AutoCompleteTextView、multiAutoCompleteTextView以及ToggleButton、checkedBox、RadioButton等相关实践

    2.针对Focused的TextView跑马灯(文字较多一行无法显示)效果 针对单个TextView的跑马灯效果,可直接在TextView控件参数中添加三个属性: android:singleLine ...

随机推荐

  1. VXLAN 概念(Part I) - 每天5分钟玩转 OpenStack(108)

    除了前面讨论的 local, flat, vlan 这几类网络,OpenStack 还支持 vxlan 和 gre 这两种 overlay network. overlay network 是指建立在 ...

  2. Form authentication(表单认证)问题

    前言 最近在做ASP.NET MVC中表单认证时出了一些问题,特此记录. 问题 进行表单认证时,在 PostAuthenticateRequest 事件中从Cookie值中解密票据.如下: prote ...

  3. 窥探Swift之函数与闭包的应用实例

    今天的博客算是比较基础的,还是那句话,基础这东西在什么时候都是最重要的.说到函数,只要是写过程序就肯定知道函数是怎么回事,今天就来讨论一下Swift中的函数的特性以及Swift中的闭包.今天的一些小实 ...

  4. Java学习笔记——回调函数

    转载:http://wangyang0311.iteye.com/blog/368031 一般来说分为以下几步: 声明回调函数的统一接口interface A,包含方法callback(); 在调用类 ...

  5. ASP.NET 5 使用 TestServer 进行单元测试

    之前如果对 ASP.NET WebAPI 进行单元测试(HttpClient 发起请求,并且可调试 WebAPI),一般采用 Owin 的方式,具体参考:<开发笔记:用 Owin Host 实现 ...

  6. [翻译]利用顶点位移的VR畸变校正

    文章英文原网址: http://www.gamasutra.com/blogs/BrianKehrer/20160125/264161/VR_Distortion_Correction_using_V ...

  7. 【字符编码】Java字符编码详细解答及问题探讨

    一.前言 继上一篇写完字节编码内容后,现在分析在Java中各字符编码的问题,并且由这个问题,也引出了一个更有意思的问题,笔者也还没有找到这个问题的答案.也希望各位园友指点指点. 二.Java字符编码 ...

  8. npm包与gem包--在线&离线安装

    目录 NPM 在线 离线 GEM 在线 离线 NPM NPM,即为Node的包管理工具,官网为 https://www.npmjs.com/,我们可以在站内搜索所需要的NPM包,了解相关的使用规则 安 ...

  9. web性能优化:详说浏览器缓存

    TOC 背景 浏览器的总流程图 一步一步说缓存 朴素的静态服务器 设置缓存超时时间 html5 Application Cache Last-Modified/If-Modified-Since Et ...

  10. Win10 UWP 开发系列:使用SplitView实现汉堡菜单及页面内导航

    在Win10之前,WP平台的App主要有枢轴和全景两种导航模式,我个人更喜欢Pivot即枢轴模式,可以左右切换,非常方便.全景视图因为对设计要求比较高,自己总是做不出好的效果.对于一般的新闻阅读类Ap ...