设计师给到的图,经常是 “按钮的左边距离文字右边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 像素” 这种奇怪的东西。

iOS 计算文字宽度的一个细节的更多相关文章

  1. IOS 计算文字尺寸(UILabel)

    方式1 :普通用法 #define  MJNameFont [UIFont systemFontOfSize:14] /** * 计算文字尺寸 * * @param text 需要计算尺寸的文字 * ...

  2. IOS计算文字高度

    1.计算文字长度 NSString* str = @"你好"; .f; NSStringDrawingOptions options = NSStringDrawingUsesLi ...

  3. ios 计算文字的尺寸

    /** * 计算文字尺寸 * @param text 需要计算尺寸的文字 * @param font 文字的字体 * @param maxSize 文字的最大尺寸 */ - (CGSize)sizeW ...

  4. canvas 计算文字宽度(常用于文字换行)

    var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.font= ...

  5. 关于ios下字体描边的一个细节

    转载请注明,来自:http://blog.csdn.net/skyman_2001    CGContextSetTextDrawingMode(context, kCGTextStroke);    ...

  6. ios 根据文字数量计算UILabel高度(已修改)

    由于留言的朋友给出了更好的方法,所以下面的代码都是它留言中给出的,优于我前面计算Lable高度方法,这个可以说非常的准,是IOS自带的计算UILABEL高度的方式. 一.实现代码 // 创建label ...

  7. iOS计算完整文字高度(适应iOS 10)

    动态计算文字的高度:(切记LineSapcing>=2,不然会显示不全) +(CGSize) boundingALLRectWithSize:(NSString*) txt Font:(UIFo ...

  8. iOS开发之计算文字尺寸

    /** *  计算文字尺寸 * *  @param text    需要计算尺寸的文字 *  @param font    文字的字体 *  @param maxSize 文字的最大尺寸 */ - ( ...

  9. ios 拉伸图片和计算文字的大小

    一.拉伸图片 /** * 传入图片的名称,返回一张可拉伸不变形的图片 * * @param imageName 图片名称 * * @return 可拉伸图片 */ + (UIImage *)resiz ...

随机推荐

  1. Unity5-CacheServer(资源平台切换之缓存服务器)的部署与使用

    不管你是个人还是团队,如果你的资源很多, 而且经常切换平台, 那你试试这个吧~~兼职爽爆了,秒秒钟实现平台间的转换. cache server主要用于资源修改后的自动重新导入功能,保证所见即所得,方便 ...

  2. 最大正方形 · Maximal Square

    [抄题]: 在一个二维01矩阵中找到全为1的最大正方形 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 返回 4 [暴力解法]: 时间分析: 空间分析:i j 中保留一 ...

  3. c语言蛋疼的字符串赋值

    我觉得c语言比较蛋疼的一个地方就是给字符串赋值,不是初始化,是赋值. char string[20]={0}; 你不能通过 string="hello";这种方式赋值.但是在字符串 ...

  4. python pip 代理设置

    pip install --proxy="user:password@server:port" packagename origin url: http://xiuxixiuxi. ...

  5. android4.2 高用zing拍照后,返回其它页面操作时,主线程关掉或程序退出的问题解决

    产生错误的代码: @Override protected void onCreate(Bundle savedInstanceState) { StrictMode.setThreadPolicy(n ...

  6. FW:程序在内存的划分(转)

    一.预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. ...

  7. vue 使用axios 数据请求第三方插件的使用

    axios 基于http客户端的promise,面向浏览器和nodejs 特色 浏览器端发起XMLHttpRequests请求 node端发起http请求 支持Promise API 监听请求和返回 ...

  8. What Are Tango Poses?Tango姿态是什么?

     What Are Tango Poses?什么是Tango姿态? As your device moves through 3D space, it calculates where it is ( ...

  9. Android实现求和运算

    实验要求: 用Android实现一个界面,在该页面点击实现加法运算. 代码实现 实现结果 输入结果为空时,如图 问题及解决 函数中使用了强制转换,当输入字符串是也能转换为int型数据,但是当输入字符时 ...

  10. vc++ 不同对话框中传递信息的方法(基于自定义消息SendMessage) (转载)

    转载自:http://blog.csdn.net/myj0513/article/details/6827360 背景: 新建了一个基于对话框的MFC程序,在主对话框中添加tabcontrol控件,又 ...