思路:

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. IOS开发之视图和视图控制器

    视图(View), 视图控制器(ViewController)是IOS开发UI部分比较重要的东西.在学习视图这一块的东西的时候,感觉和Java Swing中的Panel差不多.在UIKit框架中都有一 ...

  2. ES6学习--搭建环境

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发 ...

  3. objective-c 语法快速过(6)内存管理原理

    内存管理基本原理(最重要) 移动设备的内存极其有限(iphone 4内存512M),每个app所能占用的内存是有限制的(几十兆而已). 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不 ...

  4. Linux中解析json---jq

    遇到要在Linux上处理json的请求,换了熟悉的环境就抓瞎了,需要用心学习基础知识. jq官网:https://stedolan.github.io/jq   1.install   yum ins ...

  5. SQL Server基础之索引

     索引用于快速找出在某个列中有某一特定值的行,不使用索引,数据库必须从第一条记录开始读完整个表,直到找出相关的行.表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,数据库能快速到达一个位置 ...

  6. $\LaTeX$笔记:首字下沉

    $\LaTeX$系列根目录: Latex学习笔记-序 首字下沉 \IEEEPARstart{W}{ith} ,第一个参数W会变大,占用两行,第二个参数”ith”变会大写. 如代码 \IEEEPARst ...

  7. Hibernate —— Session

    一.概述 Session 是 Hibernate 向应用程序提供操纵数据的主要接口,它提供了基本的保存.更新.删除和加载 Java 对象的方法. 二.Session 缓存 1.简介 (1)Sessio ...

  8. 7.6 数据注解特性--StringLength

    StringLength attribute can be applied to a string type property of a class. EF Code-First will set t ...

  9. Nancy之基于Self Hosting的补充小Demo

    前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self H ...

  10. Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:9001/api/size/get. (Reason: CORS header 'Access-Control-Allow-Origin' missing).

    Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http:/ ...