ios 计算label宽度方法效率对比

news2025/1/11 20:08:06

方式1:

设置好label的文字,字号等属性后,调用

self.label.text = @"111";

self.label.font = [UIFont systemFontOfSize:17];

[self.label sizeToFit];

方式2:

使用字符串的方法计算文字宽度,

- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context;

对比2种方法的计算计算效率, 直接看结论, 使用boundingRectWithSize效率更高:

使用方法10W个字符串
sizeToFit3.18s
boundingRectWithSize2.26s

其中NSStringDrawingOptions有四个枚举值:

typedef NS_OPTIONS(NSIntegerNSStringDrawingOptions) {

  // 绘制文本时使用 line fragement origin 而不是 baseline origin

  // 整个文本将以每行组成的矩形为单位计算整个文本的尺寸

    NSStringDrawingUsesLineFragmentOrigin = 1 << 0, // The specified origin is the line fragment origin, not the base line origin

  // 计算行高时使用行距。(译者注:字体大小+行间距=行距)

    NSStringDrawingUsesFontLeading = 1 << 1, // Uses the font leading for calculating line heights

  // 计算布局时使用图元字形(而不是印刷字体)。也即是以每一个字体所占用的空间来计算文本范围

    NSStringDrawingUsesDeviceMetrics = 1 << 3, // Uses image glyph bounds instead of typographic bounds

 // 如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。如果没有指定NSStringDrawingUsesLineFragmentOrigin选项,则该选项被忽略

    NSStringDrawingTruncatesLastVisibleLine = 1 << 5, // Truncates and adds the ellipsis character to the last visible line if the text doesn't fit into the bounds specified. Ignored if NSStringDrawingUsesLineFragmentOrigin is not also set.

NS_ENUM_AVAILABLE_IOS(6_0);

attributes是文本字体的属性:该参数要设置字体的大小。

context是上下文对象,用于包含信息:如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数可为 nil。 

性能测试代码:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSInteger count = 10 * 10000;

    NSMutableArray *array = [NSMutableArray arrayWithCapacity:count];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"log" ofType:@"log"];
    NSString *str = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    NSArray *temp = [str componentsSeparatedByString:@"\n"];

    while (array.count < count) {
        [array addObjectsFromArray:temp];
    }
    NSLog(@"总计字符串数量:%zd",array.count);

    NSTimeInterval start = CACurrentMediaTime();
    for (NSInteger i = 0; i < array.count; i++) {
        self.label.text = array[i];
        [self.label sizeToFit];
    }
    NSTimeInterval end = CACurrentMediaTime();
    NSLog(@"sizeToFit %.2f",end-start); // 3.24s

    start = CACurrentMediaTime();
    for (NSInteger i = 0; i < array.count; i++) {
        CGSize textSize = CGSizeZero;
        NSDictionary *attribute = @{NSFontAttributeName:[UIFont systemFontOfSize:17]};
        textSize = [array[i] boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, 40)
                                      options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                   attributes:attribute
                                      context:nil].size;
        textSize.width = ceilf(textSize.width);
    }
    end = CACurrentMediaTime();
    NSLog(@"boundingRectWithSize %.2f",end-start); // 2.25s


    for (NSInteger i = 0; i < array.count; i++) {
        self.label.text = array[i];
        [self.label sizeToFit];


        CGSize textSize = CGSizeZero;
        NSDictionary *attribute = @{NSFontAttributeName:[UIFont systemFontOfSize:17]};
        textSize = [array[i] boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, 40)
                                      options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                   attributes:attribute
                                      context:nil].size;
        textSize.width = ceilf(textSize.width);

        if (ABS(self.label.frame.size.width - textSize.width)>1 ) {
            NSLog(@"出错计算错误, %.2f %.2f",self.label.frame.size.width,textSize.width);
        }
    }

    NSLog(@"%s结束",__func__);

}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TheFuck—Python写的超实用命令纠正工具

序言 哈喽兄弟们&#xff0c;我们在学习Python的过程中&#xff0c;有这么一款工具&#xff0c;可以轻松纠正我们写错的命令&#xff0c;简直太好用了~ The Fuck 是一款功能强大的、Python编写的应用程序&#xff0c;可用于纠正控制台命令中的错误&#xff0c;非常强大。此外…

Linux多线程(二):线程控制

文章目录一、前言二、认识线程控制函数1.线程创建2.线程退出3.线程等待4.查看线程id5.线程分离6.综合demo三、线程id本质是地址&#xff1f;一、前言 上篇博客谈到&#xff0c;Linux并没有真线程&#xff0c;而是通过复用进程的数据结构来模拟实现线程的。因此 Linux 自然不会提…

所有的为时已晚都是恰逢其时,社科院与杜兰大学金融管理硕士邀你在职读研

最近有咨询的同学询问&#xff0c;我年龄快35岁了读研晚吗&#xff1f;记得在网上看到过一句话&#xff0c;你觉得为时已晚的时候&#xff0c;恰恰是最早的时候。你可以确定一下你的内心&#xff0c;是不是真的想读研&#xff0c;既然迟早要读的话&#xff0c;与其等到了40、50…

ISO 15765-2协议分享(一)- TP时间参数详解

文章目录 前言一、时间参数协议定义二、使用步骤 1.引入库2.读入数据总结前言 无大志者常立志,让自己生活中时时有目标,有努力的方向。 老规矩,正文前分享喜欢的文字: 生活中,你越是去竭力回避不适的感觉,就越是难以推进生活中的重要转变。 不回避,积极面对,是提升自…

蓝奥声网关为什么会受到广大用户的欢迎?

蓝奥声GP20蓝牙网关是一款支持无线和有线连接的智能网关&#xff0c;配有独特的网口驱动&#xff0c;支持带有TCP/IP的以太网接口。用于互联网访问和与主机服务器的通信&#xff0c;用于远程命令和本地处理数据的数据上传/下载。它支持 RJ45/POE 和 WiFi 两种网络角色。 GP20蓝…

点面科技荣获优胜企业奖,圆满从2022“创·在上海”国际创新创业大赛之“创·加速营”毕业

创在上海 赢在未来 “创在上海”国际创新创业大赛暨中国创新创业大赛 (上海赛区) 是一项具有广泛影响力的创新创业活动。 为提升入围全国赛的参赛企业的参赛能力&#xff0c;“创在上海”将充分整合和调动多方资源&#xff0c;结合国赛进程&#xff0c;创新推出针对入围国赛企…

Git常用命令总结

配置git 本地创建 ssh key&#xff1a; ssh keygen -t rsa -c “email” // email:github上注册用的邮箱 把上面生成的 key 粘贴到 gitHUb中的 sshkey中 验证 是否成功 ssh -T gitgithub.com 如果是第一次的会 提示 是否continue &#xff0c;输入 yes 就会看到 You’ve succe…

Springboot健康上报小程序: element后台管理系统(完整代码)

这几天接到了个学生的需求&#xff0c;挺简单的&#xff0c;大概就是按照她的需求做一个疫情期间常态化管理的小程序&#xff0c;由于我对java不熟悉&#xff0c;基本上是边做边学&#xff0c;这里我将对本次项目做个记录 ✨✨欢迎订阅本专栏或者关注我&#xff0c;大家一起努力…

内科大机器学习框架课程重点内容笔记

文章目录一.背景二.内容一.背景 这是2020届内科大机器学习框架课程的考试复习内容 二.内容 1.变量间的相互关系&#xff1a; (1)确定性关系或函数关系&#xff1a;研究的是确定现象非随机变量间的关系。 (2)相关关系或统计依赖关系&#xff1a;研究的是非确定现象随机变量间…

计算机毕设Python+Vue校园一卡通管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

外滩金融峰会公布“第七届融城杯十佳案例”,工行、创邻科技等成功上榜

12月11日&#xff0c;由中国金融四十人论坛&#xff08;CF40&#xff09;主办的第四届外滩金融峰会在上海召开。国家副主席王岐山为峰会致开幕辞&#xff0c;中国人民银行原行长周小川、上海新金融研究院理事长屠光绍、中国人民银行副行长宣昌能、中央财经委员会办公室副主任尹…

存储mybatis的xml标签,动态sql 查询

前言&#xff1a; 通过表动态存储mybatis 的xml标签&#xff0c;通过动态sql 入参查询&#xff0c;方便更新查询逻辑&#xff0c;无需发版即可&#xff1b;&#xff08;当前用的是 mybatis-plus &#xff0c;db用的是oracle【这个无所谓】&#xff09; 注意事项&#xff1a;这…

【C】带你复习有趣的函数

作者 &#xff1a;会敲代码的Steve 墓志铭&#xff1a;博学笃志&#xff0c;切问静思。 前言&#xff1a;本文旨在总结C语言函数章节的知识点、分为以下九个模块、分别是&#xff1a; 1.函数是什么 2.库函数 3.自定义函数 4.函数参数 5.函数调用 6.函数的嵌套调用和链式…

vue3计算属性和侦听与script setup区别使用

一、计算属性computed 计算属性&#xff0c;只要依赖值不变&#xff0c;那么不会重新计算计算属性将基于它们的反应依赖关系缓存&#xff0c;提高性能对于任何包含响应式数据的复杂逻辑&#xff0c;应该使用计算属性 <template><!--重复使用--><p>{{ msg.s…

Redis——好友关注、共同关注、Feed流推送

1. 好友关注 在探店图文的详情页面中&#xff0c;可以关注发布笔记的作者&#xff1a; 进到探店笔记详情页&#xff0c;会发出两个请求&#xff0c;1是判断是否已经关注&#xff0c;2是尝试关注用户的请求。 关注是User之间的关系&#xff0c;是博主与粉丝的关系&#xff0c;…

你用过猿如意吗?猿如意可以使用ChatGPT哦,这里详细介绍了猿如意的功能,为什么我建议你使用猿如意,来看看吧

文章内容介绍 你是否还在为为每次安装IDE&#xff08;集成开发工具&#xff09;要去各种网站找教程而烦恼&#xff1f;你是否还在为各种文本格式转换而头痛&#xff1f;你是否在为斗图都不过兄弟们而卑微&#xff1f;你是否在为互联网中庞大冗杂却低效的教程文档而崩溃&#x…

SpringMVC:SpringMVC响应结果(7)

响应结果1. 环境准备2. 响应页面3. 响应文本数据4. 响应JSON数据&#xff08;掌握&#xff09;4.1 响应POJO对象4.2 响应POJO集合对象1. 环境准备 项目结构 pom.xml添加Spring依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"…

Mathtype / Word OMML / Latex 公式相互转换

文章目录Part.I 快应用Part.II 详细操作Chap.I Mathtype ↔ WordChap.II Mathtype ↔ LatexChap.III Latex ↔ WordPart.I 快应用 本文介绍了除了使用 Word 和 Mathtype 之外不使用其他任何辅助软件来实现三者相互转换的方法。 项目操作方法Mathtype 转成 Word OMMLWord菜单栏→…

信息化课堂怎么控屏教学的

现在的很多学校都在建设机房进行互动教学&#xff0c;相比于传统的教学方法&#xff0c;计算机的教学方式能够直观的表达每堂课的知识点&#xff0c;过程更为新颖&#xff0c;有利于吸引学生的注意力&#xff0c;提高在学习过程中的专注力。 但是&#xff0c;在提高增加课堂中学…

redo log 和binlog的相关问题及其衍生

目录 下在两阶段提交的不同时刻&#xff0c;MySQL异常重启会出现什么现象。 那么&#xff0c; MySQL怎么知道binlog是完整的? redo log 和 binlog是怎么关联起来的? 处于prepare阶段的redo log加上完整binlog&#xff0c;重启就能恢复&#xff0c;MySQL为什么要这么设计? …