iOS 学习 - 24 全局跑马灯,支持后台回到前台
思路:
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 全局跑马灯,支持后台回到前台的更多相关文章
- Android判断应用程序从后台回到前台
MainActivity如下: package cc.testbackgroundtofront; import java.util.List; import android.app.Activity ...
- Android学习总结——TextView跑马灯效果
Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize="marquee" 2.TextView必须单行显示,即内容必须 ...
- iOS学习24之UIControl及其子类
1. UIControl初识 1> 概述 UIControl是有控制功能的视图( 如UIButton.UISlider.UISegmentedControl等)的父类 只要跟控制有关的控件都是继 ...
- 【IOS】自定义可点击的多文本跑马灯YFRollingLabel
需求 项目中需要用到跑马灯来仅展示一条消息,长度合适则不滚动,过长则循环滚动. 虽然不是我写的,但看了看代码,是在一个UIView里面放入两个UILabel, 在前一个快结束的时候,另一个显示.然而点 ...
- android中实现跑马灯效果以及AutoCompleteTestView与MultiAutoCompleteTextView的学习
跑马灯效果 1.用过属性的方式实现跑马灯效果 属性: android:singleLine="true" 这个属性是设置TextView文本中文字 ...
- iOS 跑马灯带图片可点击
项目中有个需求,需要以跑马灯的形势滚动展示用户的实时数据,跑马灯需要有用户头像,内容的长度不固定,并且可以点击,滚动效果还要足够流畅,本着不重复造轮子的心理,在网上各种搜索,发现都没法找到满足需求的d ...
- iOS swift跑马灯滚动可以点击
跑马灯,从右至左循环滚动显示信息,并且支持点击事件,使用swift4.0语法完成,更加简介,通用性强,布局部分全部使用snpkit 代码: // // HXQMarqueeView.swift // ...
- IOS跑马灯效果,实现文字水平无间断滚动
ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController{ NSTimer ...
- Third Day:正式编程第三天,学习实践内容TextView跑马灯、AutoCompleteTextView、multiAutoCompleteTextView以及ToggleButton、checkedBox、RadioButton等相关实践
2.针对Focused的TextView跑马灯(文字较多一行无法显示)效果 针对单个TextView的跑马灯效果,可直接在TextView控件参数中添加三个属性: android:singleLine ...
随机推荐
- AngularJS之高级Route【三】(八)
前言 我们知道默认的路由提供(Route Provider)在复杂的应用程序中是不太适合应用场景,它存在诸多限制,所以在Angular 1.2之后此时我们不得不将路由提供作为一个单独的模块当我们需要使 ...
- 快刀斩乱麻之 Katana
Katana-武士刀,寓意:快.准.狠! 按照常规,我们一般编写的 ASP.NET 应用程序会部署在 IIS 上(有点傻的描述),在 ASP.NET 应用程序中,我们会大量使用 HttpContext ...
- ios多线程-GCD基本用法
ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法 平时比较多使用和看到的是: dispatch_async(dispatch_get_global_q ...
- Opencv摄像头实时人脸识别
Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...
- Oracle丢失重做日志的几种场景恢复
实验环境:RHEL6.4 + Oracle 11.2.0.4 一.丢失重做日志组中成员 1.1 故障模拟 1.2 处理方法 1.3 实际处理过程 二.丢失重做日志组 2.1 丢失INACTIVE重做日 ...
- 微信小程序小技巧系列《一》幻灯片,tab导航切换
作者:gou-tian 来自:github 幻灯片 使用微信小程序原生组件swiper实现. <swiper indicator-dots="{{indicatorDots}}&quo ...
- 百度eCharts体验
前言 从昨天开始给项目里添加一些图表对比功能,上一个项目里使用的是Highcharts,本打算继续用Highcharts做的,昨天试了下做出来的效果不太好,主要也是因为看的多了没什么新鲜感了,于是便尝 ...
- 【JUC】JDK1.8源码分析之ReentrantReadWriteLock(七)
一.前言 在分析了锁框架的其他类之后,下面进入锁框架中最后一个类ReentrantReadWriteLock的分析,它表示可重入读写锁,ReentrantReadWriteLock中包含了两种锁,读锁 ...
- android获得ImageView图片的等级
android获得ImageView图片的等级问题 要实现的功能如下图,点击分享能显示选中与不选中状态,然后发送是根据状态来实现具体分享功能. 在gridview中有5个子项,每个子元素都有两张图片A ...
- 学习php中的正则表达式,PHP正则表达式基础
语法格式:位于定界符"/"之间. 较为常用的元字符包括: “+”, “*”,以及 “?”. 其中, “+”元字符规定其前导字符必须在目标对象中连续出现一次或多次, “*”元字符规定 ...