iOS实现一个高性能的跑马灯
效果图

该跑马灯完全通过CATextLayer 实现,轻量级,并且通过
系统的位移动画实现滚动效果,避免了使用displaylink造成的性能瓶颈,使用系统动画,系统自动做了很多性能优化,实现更好的性能,并使用遮罩实现展示范围的限定
,实现跑马灯效果
//
// LBMarqueeLayer.m
// TEXT
//
// Created by mac on 2024/4/28.
// Copyright © 2024 刘博. All rights reserved.
//#import "LBMarqueeLayer.h"@implementation LBMarqueeLayerConfig- (instancetype)init
{self = [super init];if (self) {self.velocity = 20;self.fontSize = 14;self.textColor = [UIColor darkGrayColor];self.pauseDuration = 3;self.blankString = @" ";}return self;
}@end@interface LBMarqueeLayer () <CAAnimationDelegate>@property (nonatomic, strong) CATextLayer *textLayer;@property (nonatomic, strong) CALayer *maskLayer;@property (nonatomic, strong) LBMarqueeLayerConfig *config;@property (nonatomic, strong) CABasicAnimation *animation;@end@implementation LBMarqueeLayer- (instancetype)initwithFrame:(CGRect)frameconfig:(LBMarqueeLayerConfig *)config
{if ([super init]) {self.frame = frame;self.config = config;[self handleText];[self addSublayer:self.textLayer];}return self;
}- (void)handleText
{CGFloat width = [self.config.text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:self.config.fontSize]}].width;if (width > CGRectGetWidth(self.bounds)) {NSString *content = [NSString stringWithFormat:@"%@%@%@", self.config.text, self.config.blankString, self.config.text];NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:content attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:self.config.fontSize]}];self.textLayer.string = attributedString;CGFloat width = [content sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:self.config.fontSize]}].width;self.textLayer.frame = CGRectMake(0, 0, width, CGRectGetHeight(self.bounds));CGFloat toValue = [[NSString stringWithFormat:@"%@%@", self.config.text, self.config.blankString] sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:self.config.fontSize]}].width;self.animation.fromValue = @(0);self.animation.toValue = @(-toValue);self.animation.duration = toValue/self.config.velocity;[self.textLayer addAnimation:self.animation forKey:@"animation"];self.masksToBounds = YES;} else {self.textLayer.string = self.config.text;}}#pragma mark - animationDelegate- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{if (flag) {dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.config.pauseDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self.textLayer addAnimation:self.animation forKey:@"animation"];});}}#pragma mark - lazy load- (CATextLayer *)textLayer{if (!_textLayer) {_textLayer = [[CATextLayer alloc] init];_textLayer.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame));_textLayer.alignmentMode = kCAAlignmentLeft;_textLayer.fontSize = 14;_textLayer.foregroundColor = self.config.textColor.CGColor;}return _textLayer;}- (CALayer *)maskLayer{if (!_maskLayer) {_maskLayer = [[CALayer alloc] init];_maskLayer.frame = self.bounds;}return _maskLayer;}- (CABasicAnimation *)animation{if (!_animation) {_animation = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"];if (!self.config.hasPause) {_animation.repeatCount = NSIntegerMax;}_animation.delegate = self;}return _animation;}@end
调用
- (LBMarqueeLayer *)textLayer
{if (!_textLayer) {LBMarqueeLayerConfig *config = [[LBMarqueeLayerConfig alloc] init];config.hasPause = YES;config.pauseDuration = 3;config.blankString = @" ";config.text = @"这是一首非常好听的歌曲哈哈哈哈";_textLayer = [[LBMarqueeLayer alloc] initwithFrame:CGRectMake(100, 100, 200, 50) config:config];_textLayer.backgroundColor = [UIColor cyanColor].CGColor;}return _textLayer;
}相关文章:
iOS实现一个高性能的跑马灯
效果图 该跑马灯完全通过CATextLayer 实现,轻量级,并且通过 系统的位移动画实现滚动效果,避免了使用displaylink造成的性能瓶颈,使用系统动画,系统自动做了很多性能优化,实现更好的性能,并使用…...
MySQL的视图、存储过程、触发器
视图 介绍 视图是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时…...
【图像特征点匹配】
图像特征点匹配 图像特征点匹配是计算机视觉中的一项关键技术,它涉及在两个或多个图像之间寻找并匹配具有独特属性的点,这些点被称为特征点。 立体视觉:通过匹配同一场景的不同视角图像中的特征点,可以重建场景的三维结构。物体识别:通过匹配物体表面的特征点,可以识别和…...
GZIPOutputStream JSON压缩
一、背景 小王瞥了一眼历史记录表,不禁惊呼:“这表怎么这么大?”同事们闻声纷纷围拢过来查看。仔细一瞧,发现这个表的大小竟然超过了3G。主管随即指示小王打开相应的表数据检查,发现其中存储了用户的权限信息…...
毫米波雷达原理(含代码)(含ARS548 4D毫米波雷达数据demo和可视化视频)
毫米波雷达原理 1. 传统毫米波雷达1.1 雷达工作原理1.2 单目标距离估计1.3 单目标速度估计1.4 单目标角度估计1.5 多目标距离估计1.6 多目标速度估计1.7多目标角度估计1.7 总结 3. FMCW雷达数据处理算法4. 毫米波雷达的目标解析(含python代码)5. ARS548 4D毫米波雷达数据demo(含…...
3.1 Gateway之路由请求和转发
1.依赖坐标 <!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--服务注册和发现--><dependency><groupId>com.alibab…...
人脸识别开源算法库和开源数据库
目录 1. 人脸识别开源算法库 1.1 OpenCV人脸识别模块 1.2 Dlib人脸识别模块 1.3 SeetaFace6 1.4 DeepFace 1.5 InsightFace 2. 人脸识别开源数据库 2.1 CelebA 2.2 LFW 2.3 MegaFace 2.4 Glint360K 2.5 WebFace260M 人脸识别 (Face Recognition) 是一种基于人的面部…...
Excel 中用于在一个范围中查找特定的值,并返回同一行中指定列的值 顺序不一样 可以处理吗
一、需求 Excel 中,在一列(某范围内)查找另一列特定的值,并返回同一行中另一指定列的值, 查找列和返回列的顺序不一样 二、 实现 1、下面是一个使用 INDEX 和 MATCH 函数的例子: 假设你有以下数据&…...
MySql-日期分组
一、分别统计各时间各类型数据条数 数据库的 request_time字段 数据类型:timestamp 默认值:CURRENT_TIMESTAMP 例子: 2024-01-26 08:25:48 原数据: 1、将数据按照日期(年月日)形式输出 按照request_…...
有哪些方法可以在运行时动态生成一个Java类?
使用 Java 反射 API🚩: Java 的反射 API 允许在运行时查询和操作类和对象。虽然反射 API 本身不直接提供生成新类的功能,但可以用于动态调用构造函数、方法和访问字段,这在某些情况下可以作为动态生成类的一部分。 字节码操作库&…...
JAVA两个线程交替打印实现
方案1 Semaphore 机制 通过信息号机制来 协调两个线程,一个线程打印后,给另一个线程释放一个信号量 Semaphore semaphorea new Semaphore(1);Semaphore semaphoreb new Semaphore(0);Thread threada new Thread(new Runnable() {Overridepublic void…...
【C语言】学习C语言
C语言简介 C语言是一门十分流行的编程语言,由美国贝尔实验室的 Dennis Ritchie 在 20 世纪 70 年代开发。 C语言具有高效、可移植、灵活、简单等特点,被广泛应用于操作系统、编译器、数据库、图形界面、嵌入式系统、网络通信、游戏等领域。 本文将带你…...
C 深入指针(2)
目录 1 野指针 1.1 成因 1.2 如何规避野指针 2 assert 断言 2.1 用法 2.2 assert 的优点 2.1 assert 的缺点 3 小注解 3.1 Debug 和 Release 1 野指针 【概念】: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的&#…...
FileLink跨网文件交换,推动企业高效协作|半导体行业解决方案
随着信息技术的迅猛发展,全球信息产业已经迎来了前所未有的繁荣与变革。在这场科技革命中,半导体作为信息产业的基础与核心,其重要性日益凸显,半导体的应用场景和市场需求将进一步扩大。 然而,在这一繁荣的背后&#x…...
代码随想录day56 | 动态规划P16 | ● 583. ● 72. ● 编辑距离总结篇
583. 两个字符串的删除操作 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例 1: 输入: word1 "sea", word2 "eat" 输出: 2 解释: 第一步将 &quo…...
ASP.NET网络在线考试系统
摘 要 随着计算机技术的发展和互联网时代的到来,人们已经进入了信息时代,也有人称为数字化时代。数在数字化的网络环境下,学生希望得到个性化的满足,根据自己的情况进行学习,同时也希望能够得到科学的评价,…...
天锐绿盾 | 办公加密系统,源代码防泄密、源代码透明加密、防止开发部门人员泄露源码
天锐绿盾作为一款专注于数据安全与防泄密的专业解决方案,它确实提供了针对源代码防泄密的功能,帮助企业保护其核心的知识产权。 PC地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是天锐绿盾可能采…...
Day1| Java基础 | 1 面向对象特性
Day1 | Java基础 | 1 面向对象特性 基础补充版Java中的开闭原则面向对象继承实现继承this和super关键字修饰符Object类和转型子父类初始化顺序 多态一个简单应用在构造方法中调用多态方法多态与向下转型 问题回答版面向对象面向对象的三大特性是什么?多态特性你是怎…...
Spring 事务失效的几种情况
目录 1. 事务方法不是public 2. 自调用问题 3. 异常处理不当 4. 数据源或事务管理器配置错误 5. 事务传播行为不当 6. 代理方式不正确 7. 事务同步问题 1. 事务方法不是public 在Spring中,默认情况下,只有public方法上的Transactional注解才会被代…...
【Linux 命令操作】如何在 Linux 中使用多行注释呢?
文章目录 1. 给代码进行多行注释2. 给代码取消多行注释 1. 给代码进行多行注释 🐧① 首先用 vim 打开代码,按 Esc进入命令模式(Normal mode); 🐧② 然后按住 ctrl v 进入列模式; 🐧③ 再通过按 h(左)、j(…...
RMBG-2.0隐私安全优势解析:纯本地推理杜绝图片上传与数据泄露风险
RMBG-2.0隐私安全优势解析:纯本地推理杜绝图片上传与数据泄露风险 在数字时代,图片处理已经成为日常工作和创作的重要组成部分,但随之而来的隐私安全问题也日益凸显。许多在线抠图工具需要用户上传图片到云端服务器进行处理,这不…...
从理论到代码:手把手实现Newmark-Beta方法的结构动力学模拟
从理论到代码:手把手实现Newmark-Beta方法的结构动力学模拟 结构动力学模拟是现代工程设计与分析中不可或缺的工具,从桥梁抗震到航天器振动分析,都需要精确预测结构在动态载荷下的响应。而Newmark-Beta方法作为这一领域的经典算法,…...
我的LVDS信号有振铃?可能是端接电阻没选对!从仿真到实测的端接方案选择指南
LVDS信号振铃问题全解析:从端接电阻选择到实测验证 振铃现象是LVDS信号传输中最令人头疼的问题之一。当你在示波器上看到信号边沿出现振荡波形时,第一反应可能是怀疑PCB布局或信号源质量。但经验丰富的工程师都知道,80%的振铃问题根源在于端接…...
革新性植物大战僵尸全能修改工具:重定义游戏体验
革新性植物大战僵尸全能修改工具:重定义游戏体验 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 植物大战僵尸辅助工具PVZ Toolkit是一款专为经典游戏《植物大战僵尸》PC版设计的开源修…...
7个赛车数据分析实用技巧:Python F1赛事数据处理实战指南
7个赛车数据分析实用技巧:Python F1赛事数据处理实战指南 【免费下载链接】Fast-F1 FastF1 is a python package for accessing and analyzing Formula 1 results, schedules, timing data and telemetry 项目地址: https://gitcode.com/GitHub_Trending/fa/Fast-…...
不止于仿真:用Cadence 617深入理解共源放大器中的源级负反馈(附电阻负载对比案例)
从仿真到洞察:Cadence 617揭示共源放大器源极负反馈的物理本质 在集成电路设计的进阶阶段,工程师常会遇到一个关键转折点:能够熟练操作仿真工具并不等同于真正理解电路行为。共源放大器作为模拟电路设计的基石,其源极负反馈机制的…...
VSCode远程开发终极指南:5分钟搞定跳板机+服务器免密配置(附SSH密钥生成教程)
VSCode远程开发终极指南:5分钟搞定跳板机服务器免密配置 每次连接远程服务器都要输入密码、反复跳转终端,是不是已经让你精疲力尽?作为开发者,我们值得拥有更优雅的远程开发体验。今天要分享的这套方案,不仅能让你在VS…...
开源音频格式转换终极指南:ncmdumpGUI实现数字音乐资产自由流转的完整方案
开源音频格式转换终极指南:ncmdumpGUI实现数字音乐资产自由流转的完整方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 在数字音乐时代…...
构建非苹果硬件的macOS运行环境:Hackintosh长期维护方案
构建非苹果硬件的macOS运行环境:Hackintosh长期维护方案 【免费下载链接】Hackintosh Hackintosh long-term maintenance model EFI and installation tutorial 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintosh 定位项目核心价值 Hackintosh项目作…...
Chord - Ink Shadow 一键部署与测试:从零开始的完整链路验证
Chord - Ink & Shadow 一键部署与测试:从零开始的完整链路验证 最近在折腾大模型本地部署,发现了一个挺有意思的镜像,叫 Chord - Ink & Shadow。名字听起来有点神秘,其实它是一个集成了多种功能的智能模型镜像。网上关于…...
