iOS使用[核心动画]和[定时器]两种方式实现【呼吸灯动画】(仿蘑菇街价格标签)...

本文主要是介绍iOS使用[核心动画]和[定时器]两种方式实现【呼吸灯动画】(仿蘑菇街价格标签)...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

最近公司需求做个类似小红书的标签呼吸灯动画,经过一段时间研究使用两种方式实现了该效果…

呼吸灯效果图

第一种方式使用定时器加 UIView动画,核心方法如下

 
  1. -(void)begigFlashAnimation {
  2. // 缩放 + 透明度动画
  3. self.flashView.transform = CGAffineTransformMakeScale(0.1, 0.1);
  4. [UIView animateWithDuration:3 animations:^{
  5. self.flashView.transform = CGAffineTransformMakeScale(1,1);
  6. self.flashView.alpha = 1.0;
  7. [UIView beginAnimations:@"flash" context:nil];
  8. [UIView setAnimationDuration:2];
  9. [UIView setAnimationCurve:UIViewAnimationCurveLinear];
  10. self.flashView.alpha = 0;
  11. [UIView commitAnimations];
  12. }];
  13. }

第二种方式使用核心动画的动画组,核心方法如下

 
  1. - (CAAnimationGroup *)groups {
  2. if (!_groups) {
  3. // 缩放动画
  4. CABasicAnimation * scaleAnim = [CABasicAnimation animation];
  5. scaleAnim.keyPath = @"transform.scale";
  6. scaleAnim.fromValue = @0.1;
  7. scaleAnim.toValue = @1;
  8. scaleAnim.duration = 2;
  9. // 透明度动画
  10. CABasicAnimation *opacityAnim=[CABasicAnimation animationWithKeyPath:@"opacity"];
  11. opacityAnim.fromValue= @1;
  12. opacityAnim.toValue= @0.1;
  13. opacityAnim.duration= 2;
  14. // 创建动画组
  15. _groups =[CAAnimationGroup animation];
  16. _groups.animations = @[scaleAnim,opacityAnim];
  17. _groups.removedOnCompletion = NO;
  18. _groups.fillMode = kCAFillModeForwards;
  19. _groups.duration = 2;
  20. _groups.repeatCount = FLT_MAX;
  21. }
  22. return _groups;
  23. }

对比两种方法,第一种方法需要使用定时器,第二个则不需要,不知道这样是否第二个性能性对来说会好点呢?

DEMO:https://github.com/Caiflower/XXTwinkleView

原文地址:http://bbs.520it.com/forum.php?mod=viewthread&tid=2492

 

之前写了篇关于呼吸灯动画的,有几个朋友问我应用场景,刚好最近有用到,借此来实际应用下,先看看效果图;

看了上面图片相信能想到一些实际的应用场景了吧
这里我已经将此控件简单封装了下,

你可以这么用

 
  1. // 创建 并设置标题,显示位置
  2. self.markView = [XXMarkTwinkleView markViewWithTitle:@"韩式波波头" showInRight: YES];
  3. // 宽度不用传,内部自适应了,如果对字体没有太大要求,高度其实也可以在内部固定
  4. self.markView.frame = CGRectMake(230, 320, 0, 30);
  5. // 设置文字颜色
  6. self.markView.textColor = [UIColor redColor];
  7. [self.view addSubview:self.markView];

也可以这么用

 
  1. // 快读创建一个呼吸灯view
  2. XXTwinkleView *twinkleView = [[XXTwinkleView alloc]initWithColor:[UIColor redColor] edgeColor:[UIColor whiteColor] circleWidth:8 edgeWidth:2];
  3. // 根据呼吸灯view创建 标签
  4. XXMarkTwinkleView *markView1 = [[XXMarkTwinkleView alloc]initWithTwinkleView:self.twinkleView showInRight:NO];
  5. // 设置标题
  6. markView1.title = @"波波头";
  7. // 宽度自适应不需要传宽度
  8. markView1.frame = CGRectMake(120, 360, 0, 30);
  9. [self.view addSubview:markView1];

并没有啥难点就做了个自适应宽度,只需要设置呼吸灯控件的位置,内部会根据标签显示在左边还是右边,后台返回呼吸灯控件的位置,我们根据呼吸灯的位置来创建标签,所以外面设置frame中的x,y应该是呼吸灯控件的中心点,所以这里需要注意的是,如何在内部修改控件的位置,具体方法如下

 
  1. - (void)layoutSubviews {
  2. [super layoutSubviews];
  3. // 下移一半
  4. CGRect tmpBounds = self.bounds;
  5. tmpBounds.origin.y -= self.cf_height * 0.5;
  6. self.bounds = tmpBounds;
  7. // 根据标签显示的位置,布局子控件
  8. if (self.isShowInRight) {
  9. self.twinkleView.frame = CGRectMake(-kTwinkleWidth * 0.5, -kTwinkleWidth * 0.5 , kTwinkleWidth, kTwinkleWidth);
  10. self.tagLable.frame = CGRectMake(self.twinkleView.cf_maxX + kContentMargin, -self.cf_height * 0.5 , self.tagLable.cf_width + kLabelAdditionalWidth, self.cf_height);
  11. // 设置宽度
  12. self.cf_width = self.tagLable.cf_maxX;
  13. }else {
  14.  
  15. self.tagLable.frame = CGRectMake(0, -self.cf_height * 0.5 , self.tagLable.cf_width + kLabelAdditionalWidth, self.cf_height);
  16. self.twinkleView.frame = CGRectMake(self.tagLable.cf_maxX + kContentMargin, -kTwinkleWidth * 0.5 , kTwinkleWidth, kTwinkleWidth);
  17. // 计算宽度
  18. CGFloat width = self.twinkleView.cf_minX + kTwinkleWidth * 0.5;
  19. // 修改x值
  20. self.cf_x = self.cf_x - width;
  21. // 设置宽度
  22. self.cf_width = width ;
  23. }
  24. // 设置圆角半径
  25. self.tagLable.layer.cornerRadius = self.cf_height * 0.5;
  26. }

具体效果请看 https://github.com/Caiflower/XXTwinkleView

 

原文地址: http://bbs.520it.com/forum.php?mod=viewthread&tid=2516

转载于:https://my.oschina.net/u/2345393/blog/758307

这篇关于iOS使用[核心动画]和[定时器]两种方式实现【呼吸灯动画】(仿蘑菇街价格标签)...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/386334

相关文章

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4