思路:

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. 利用xinetd进行时间同步

    时间同步,往往是大型项目里一个基本的需求:如果现在有多台服务器需要时间同步为标准时间,一般有如下两种做法: 一:NTP服务 将一台能上外网的服务器配成公网时间服务器(譬如:ntp服务配置文件中的0.r ...

  2. Oracle并行添加主键的方法

    环境:Oracle 11.2.0.3 需求:生产一张表由于前期设计不当,没有主键.现需要添加主键,数据量很大,想并行建立.   1.直接添加,提示ora-3001:未实施的功能;只能单线程建立主键 S ...

  3. MySQL入门01-MySQL源码安装

    操作系统:CentOS 6.7 MySQL版本:5.6.30 1.前期准备 2.系统配置 3.CMake编译配置 4.make && make install 5.后期配置和测试 Re ...

  4. MySQL的多存储引擎架构

    支持多种存储引擎是众所周知的MySQL特性,也是MySQL架构的关键优势之一.如果能够理解MySQL Server与存储引擎之间是怎样通过API交互的,将大大有利于理解MySQL的核心基础架构.本文将 ...

  5. 由项目浅谈JS中MVVM模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    背景 最近项目原因使用了durandal.js和knock ...

  6. 魔方渗透系统安装VMtools教程

    虚拟机魔方渗透系统安装VMtools教程 1.开机登陆后,如图点击安装VMtools. 2.进入media文件夹: cd /media   查看mdia文件夹内容: ls   3.打开VMware T ...

  7. 关于Javascript中通过实例对象修改原型对象属性值的问题

    Javascript中的数据值有两大类:基本类型的数据值和引用类型的数据值. 基本类型的数据值有5种:null.undefined.number.boolean和string. 引用类型的数据值往大的 ...

  8. Apache 创建虚拟主机目录和设置默认访问页面

    虚拟主机 (Virtual Host) 是在同一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术. 可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口, 也可让多个网站拥有不同 ...

  9. Hibernate —— Entity.hbm.xml

    一.简述 1.对象关系映射文件,用于映射实体类和关系数据库数据表之间的一个 xml 文件. 2.通过 Entity.hbm.xml 映射文件,Hibernate 可以理解持久化类和数据表之间的对应关系 ...

  10. 数字限时增长效果实现:numberGrow.js

    这是上周工作中写到的一个功能,大概的效果就是页面中有几处数字,统计公司的一些业务信息,需要在第一次出现的时候,做一个从0开始增长,大概2秒自动增长到真实数值,并停止增长的效果.这个问题的重点在于解决如 ...