iOS 计算文字宽度的一个细节

设计师给到的图,经常是 “按钮的左边距离文字右边5px” 这样子的标注。于是我们需要计算文字的宽度。
有两种方法:

  1. labelbuttonsizetofit 方法

    [label sizeToFit];
    NSLog(@"label size is %@",[NSValue valueWithCGSize:label.bounds.size]);
    
  2. sizeWithAttributes方法

    CGSize size = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];
    NSLog(@"size WithAttributes is %@",[NSValue valueWithCGSize:size]);  
    

结果如何呢?

label size is NSSize: {96.5, 20.5}
size WithAttributes is NSSize: {96.39697265625, 20.287109375}

可见两个返回值不同,第二种方法返回的值似乎精确,应该用哪个呢?
我们来看下文档怎么说的。

  1. 关于 sizeWithAttributes 的文档

    This method returns fractional sizes; to use a returned size to size views, you must raise its value to the nearest higher integer using the ceil function.

  2. 关于 sizeToFit 的文档

    Call this method when you want to resize the current view so that it uses the most appropriate amount of space.

在文档中,明确指出了使用 sizeWithAttributes 时,需要使用 ceil 方法取整。而 sizeToFit 方法会当前 view 的大小调整为 appropriate 大小。
这里的关键是对 appropriate 的理解。我说下我的理解,至少应该满足两个条件:

  1. 不截断
    就是说返回的值应该不小于文字的宽度/长度,否则会被截断。
  2. 像素对齐
    所有的 view 的起始和结束为止都应该在物理像素上。因此在 @2x 屏幕应该返回 0.5 的整数倍,在 @1x 屏幕上应该返回 1 的整数倍。

因此应该用第二种方法,或者把第一种方法的结果向上取整。
如果直接使用第一种方法的结果,会导致其他界面像素对不齐,有奇怪的表现。
想象一下计算机如何处理 “一条线段,起点是 3.452 像素,终点是 56.341 像素” 这种奇怪的东西。

转载于:https://www.cnblogs.com/huahuahu/p/iOS-ji-suan-wen-zi-kuan-du-de-yi-ge-xi-jie.html

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

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

相关文章

Exchange Server 2013日记功能

9.6 日记9.6.1 日记功能为什么很重要首先,了解日记功能与存档功能之间的区别十分重要:首先,了解日记功能与存档功能之间的区别十分重要: “日记”可以记录组织中的所有通信(包括电子邮件通信),以…

VB数据库经典实例总结(二)

大家先看一张似图非图的图、 我们先称它为“过程”也许有不对的地方,在我学数据库到这个阶段、到这个刚刚接触、初生牛犊不怕虎的阶段对它的理解是这样的、所有的都是这个过程、只是在这中间掺杂了一些知识点(我们要掌握的)针对有些个别的&am…

适用于单片机的FFT快速傅里叶变换算法,51单片机都能用

目录源码FFT.cFFT.h使用方法效果其他部分的代码main.c普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 算法来自FFT算法的使用说明与C语言版实现源码 —— 原作者:吉帅虎 速度更快的版本见C语言实现的FFT与IFFT源代码…

第9课 - 函数重载分析(下)

第9课 - 函数重载分析(下) 1. 重载与指针 1.1 下面的函数指针将保存哪个函数的地址? 1.2 函数重载遇上函数指针 将重载函数名赋值给函数指针时: (1)根据重载规则挑选与函数指针参数列表一致的候选者 &#…

常见窗函数的C语言实现及其形状,适用于单片机、DSP作FFT运算

目录源码WindowFunction.cWindowFunction.h使用形状三角窗巴特利特窗巴特利特-汉宁窗布莱克曼窗布莱克曼-哈里斯窗博曼窗切比雪夫窗平顶窗高斯窗海明窗汉宁窗纳托尔窗Parzen窗矩形窗(模拟)效果无窗汉宁窗平顶窗平台:Windows 10 20H2 Visual …

cs

cs.yuneasy.cn 7989root yuneas123killall -9 caps cd capserver ./caps -cx转载于:https://www.cnblogs.com/bevis/p/3152633.html

.net Json JavaScriptSerializer JsonHelper类

结合.net 的JavaScriptSerializer 类实现Json数据处理 调用1: Model.Users m BLL.UsersBLL.GetUserById(Convert.ToInt32(id));string result "";if (m ! null)result JsonHelper.ObjectToJSON(m);context.Response.Write(result); 调用2&#xff…

C语言实现的FFT与IFFT源代码,不依赖特定平台

目录源码FFT.cFFT.h使用方法初始化输入数据FFT 快速傅里叶变换解算FFT结果使用python绘制FFT波形IFFT 快速傅里叶逆变换解算IFFT结果Windows 10 20H2 Visual Studio 2015 Python 3.8.12 (default, Oct 12 2021, 03:01:40) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on …

产品经理能力产品经理工作积累(3)

每日一贴,今天的内容关键字为产品经理能力 按职业司理的层次模型产品司理又可分工匠型,元帅型和老师型. (1). 工匠型 工匠型产品司理主要的代价在于:在某个专业领域里其技能的娴熟水平. (2). 元帅型 元帅型产品司理,可以在一个领域中带领一帮人来完成一个特定的项目.他的能力体…

垂直和水平居中方法小结

水平居中 行内元素 text-align:center; 块元素 1.定宽块元素水平居中 margin:0 auto; 2.不定宽块元素水平居中 方法一&#xff1a;利用浮动的包裹性和百分比相对定位 <div classouter><div classinner></div> </div> 我们想要使inner(不定宽)水平居中于…

MySQL命令行导出数据库

MySQL命令行导出数据库&#xff1a; 1&#xff0c;进入MySQL目录下的bin文件夹&#xff1a;cd MySQL中到bin文件夹的目录 如我输入的命令行&#xff1a;cd C:\Program Files\MySQL\MySQL Server 4.1\bin (或者直接将windows的环境变量path中添加该目录) 2&#xff0c;导出数据库…

在51单片机上使用递归的注意事项

目录问题应对措施原理普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 问题 在Keil C51中直接使用递归会报如下警告&#xff1a; recursive call to non-reentrant function 为了提高运行效率&#xff0c;C51采用静态分配局部变量…

ASP.Net 获取服务器信息

1: Response.Write("服务器机器名&#xff1a;" Server.MachineName); 2: Response.Write("<br/>");3: Response.Write("服务器IP地址&#xff1a;" Request.ServerVariables["LOCAL_ADDR"]);4: Response.Write("<br/…

POJ 2456 - Aggressive cows(二分)

Description Farmer John has built a new long barn, with N (2 < N < 100,000) stalls. The stalls are located along a straight line at positions x1,…,xN (0 < xi < 1,000,000,000). His C (2 < C < N) cows don’t like this barn layout and becom…

〖Android〗存在多个Android设备时,使用Shell脚本选择一个Android设备

Shell脚本&#xff1a; #!/bin/bash devices( $(adb devices|grep device$|awk {print $1}|xargs echo) )case ${#devices[]} in0 )echo "cant found a android device!";;1 )serial$devices;;* )select serial in ${devices[]}; dobreak;done;; esacif [[ -z $seria…

C盘瘦身:QQ文件的清理及Group2文件夹

目录问题解决方法Windows 10 20H2 TIM 问题 最近C盘被撑爆了 使用SpaceSniffer一扫发现QQ的文件中有个Group2文件夹占了我17G 但使用QQ自带的个人文件夹清理却扫不到&#xff0c;据说直接删除会丢失近期所有群聊的聊天图片 解决方法 在这个地方找到了大神fsz1987给出的解…

分享20个Android游戏源代码。以后看看。

分享20个Android游戏源码&#xff0c;希望大家喜欢哈&#xff01;http://www.apkbus.com/android-21834-1-1.htmlAndroid 疯狂足球游戏源码http://www.apkbus.com/android-20986-1-1.htmlandroid源码捏苍蝇游戏源码http://www.apkbus.com/android-20987-1-1.htmlAndroid游戏源码…

【.Net】C# 将Access中时间段条件查询的数据添加到ListView中

一、让ListView控件显示表头的方法 在窗体中添加ListView 空间&#xff0c;其属性中设置&#xff1a;View属性设置为&#xff1a;Detail&#xff0c;Columns集合中添加表头中的文字。 二、利用代码给ListView添加Item。 首先&#xff0c;ListView的Item属性包括Items和SubItems…

获取ArcGIS安装路径

在要素类进行符号化时&#xff0c;使用axSymbologyControl需要安装路径下的Style文件路径&#xff0c;在AE9.3VS2008中是这样的&#xff1a; Microsoft.Win32.RegistryKey regKey Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\ESRI\\CoreRuntime",…

【51单片机快速入门指南】3.2:定时器/计数器

目录快速使用硬知识传统51单片机 CPU 时序的有关知识&#xff08;12T&#xff09;51 单片机定时器原理51 单片机定时/计数器结构定时器/计数器0/1定时器/计数器0和1的相关寄存器控制寄存器工作模式寄存器工作模式模式0(13位定时器/计数器)模式1(16位定时器/计数器)模式2(8位自动…