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

news/2024/5/15 14:59:30

该跑马灯完全通过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];}return self;
}@end@interface LBMarqueeLayer ()@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.text];self.textLayer.string = content;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] sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:self.config.fontSize]}].width;self.animation.fromValue = @(0);self.animation.toValue = @(-toValue + 3);self.animation.duration = toValue/self.config.velocity;[self.textLayer addAnimation:self.animation forKey:@"animation"];self.masksToBounds = YES;// self.mask = self.maskLayer;} else {self.textLayer.string = self.config.text;}
}#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"];_animation.repeatCount = NSIntegerMax;}return _animation;
}@end

http://www.mrgr.cn/p/24274510

相关文章

[2022DASCTF Apr X FATE 防疫挑战赛] warmup-java

没错,还是java。 我就跟java杠上了。 分析 先看依赖:没有啥特别的。 审一下源码: IndexController.java:warmup路由下传参data,下面把十六进制转为字节直接反序列化了。 看下动态代理MyInvocationHandler.java:看一下Utils的hexStringToBytes方法: 下面分析来自Java专题…

设计模式01 -----单例模式

单例模式是一种常见的设计模式,用于确保类只有一个实例,并提供一个全局访问点。这种模式通常用于管理共享资源,例如数据库连接、日志文件等。单例模式的主要特点包括: 单一实例: 该模式确保类只有一个实例存在,无论何时何地都可以访问到这个实例。 全局访问点: 单例模式提…

linux网络DNS域名解析服务

DNS概述 1.DNS系统 DNS(Domain Name System),使用应用层协议,是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 简单来说就是:把域名转换成网络可以识别的IP地址,在通过IP地址访问主机。这种由文字组成的名称,显而易…

智慧之眼:碎石厂工业园区可视化引领未来

碎石厂工业园区可视化,就是将园区的各项数据、运行状态以及管理信息通过图形化、数字化的方式呈现出来。这种创新的技术手段,不仅让园区的日常运营更加高效,也极大地提升了管理决策的准确性和时效性。在时代的浪潮中,工业发展日新月异,碎石厂工业园区作为建材行业的重要一…

【函数式接口使用✈️✈️】配合策略模式实现文件处理的案例

目录 🍸前言 🍻一、功能描述 🍺二、面向对象设计模式 🍹三、策略模式 🍦四、策略 VS 面向对象 🍨章末 🍸前言 小伙伴们大家好,上周初步了解了下函数式接口,Consume…

生态环境监测系统:守护绿色地球,共筑美好家园

生态环境是人类赖以生存的基础,随着工业化和城市化的快速发展,生态环境问题日益凸显,如何有效监测和保护生态环境成为全球关注的焦点。生态环境监测系统的建立,旨在通过高科技手段,全面掌握生态环境质量,评估生态保护成效,为制定科学的环境保护政策提供依据。 项目背景 …

IDEA更换新版本启动没反应

目前安装了新的IDEA(压缩包方式),由于老版本的IDEA还在用,所以并没有删除,但是安装完后发现点击idea64.exe后没有反应,于是网上找了好多方法最后解决了 下面是我的解决过程 新版本:IntelliJIdea2024.1 老版本: Intelli…

Markdown文件上传到博客图片处理

Markdown文件上传到博客图片处理 使用Dotnet-cnblog工具可以配合typora实现自动上传md文件里图片到博客园的图床,这样就不用自己一张张来上传 Dotnet-cnblog安装使用 1.配置NET环境 net环境下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/5.0 下载后安装NET环…

忘记不再是问题:MySQL关键知识点速查

文章目录 MySQL备忘录内容连接MYSQL创建和展示数据库创建表修改表查询聚合与分组插入数据更新数据删除数据类型强制转换 更多内容 MySQL备忘录 做项目时,可能需要快速获取MySQL的使用方法,比如语法规则和函数用法。这正是备忘单的用途。 这里总结了一份…

ZCMU-1129

数学公式题罢了 学长1.斯特灵公式: 2.对数公式(因为以10为底,得到的是10^x,所以最后向下取整加上1);#include<cstdio> #include<cmath> using namespace std; const double PI=acos(-1); const double e=exp(double(1)); int str(int n){return floor(log10(s…

C#实现TFTP客户端

1、文件结构 2、TftpConfig.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace TftpTest {public class TftpConfig{}/// <summary>/// 模式/// </summary>public enum Modes{…

BLE --- 直接测试模式(可测天线性能)

认识BLE协议栈 —— 直接测试模式 BLE协议充分考虑了设备的测试问题,在协议栈层面提供了直接测试模式,用于执行BLE设备的RF物理层一致性的测试。 直接测试模式(Direct Test Mode)常简称为DTM。 DTM测试的核心工作是令设备在指定的频率上发送一段数据序列,在另一端使用测试…

电力能源箱3D可视化:开启智慧能源管理新篇章

随着科技的不断进步&#xff0c;电力能源箱的管理与维护逐渐向着智能化、可视化的方向发展。3D可视化技术的崛起&#xff0c;不仅极大地提升了能源管理的效率&#xff0c;更以其直观、生动的特点&#xff0c;引领着电力能源管理领域迈入了一个全新的时代。 电力能源箱作为电力系…

全景剖析阿里云容器网络数据链路(七):Terway DataPath V2(Terway≥1.8.0)

全景剖析阿里云容器网络数据链路(七):Terway DataPath V2(Terway≥1.8.0)作者:余凯 前言 近几年,企业基础设施云原生化的趋势越来越强烈,从最开始的IaaS化到现在的微服务化,客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度,也…

httpClient提交报文中文乱码

httpClient提交中文乱码&#xff0c;ContentType类型application/json 指定提交参数的编码即可 StringEntity se new StringEntity(paramBody.toJSONString(),"UTF-8");se.setContentType("application/json");context.httpPost.setHeader("Cookie&…

[转载] RPATH/LD_LIBRARY_PATH/RUNPATH

原文地址: https://zhuanlan.zhihu.com/p/534778561 rpath和runpath都是用来指定搜索动态链接库的目录的,如果不清楚动态链接库是什么,可见静态库vs动态库。 动态链接库(shared libraries)作为库并不像静态库一样和可执行文件绑定,而是在运行时加载。但,可执行文件在运行…

mybatis的使用技巧9——mysql按年、季度、月、周等不同时间维度查询或分组统计

在实际项目开发过程中&#xff0c;按不同时间维度查询业务数据的操作异常频繁。比较多的操作如支持按时间周期范围做列表数据的筛选&#xff0c;或者是按年月日等维度的图表展示&#xff0c;亦或者是首页的概况&#xff0c;三维大屏的展示等&#xff0c;都离不开不同时间周期查…

在vue2中,什么是双向绑定,为什么vue3要进行优化?

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定举个栗子 当用户填…

unocss如何使用css变量

在 UnoCSS 中,可以直接使用 CSS 变量来定义样式。但是,UnoCSS 本身并不支持直接使用变量名作为类名或选择器。 如果想使用 CSS 变量来定义样式,可以按照以下方式进行操作: 在 CSS 文件中定义一个变量,例如 --text-color: red;。 在 UnoCSS 的样式表中,可以通过 var() 函数…