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 像素” 这种奇怪的东西。

时间: 2024-10-10 08:21:37

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

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

转载请注明,来自:http://blog.csdn.net/skyman_2001 CGContextSetTextDrawingMode(context, kCGTextStroke); CGContextSetRGBStrokeColor(context, pInfo->strokeColorR, pInfo->strokeColorG, pInfo->strokeColorB, 1); CGContextSetLineWidth(context, pInfo->strokeS

IOS计算文字高度

1.计算文字长度 NSString* str = @"你好"; const float kFontSize = 18.f; NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading; CGRect rect = [str boundingRectWithSize:CGSizeMake(MAXFLOAT,MAXFLOAT) options:

ios 计算label宽度(高度)出错在iPhone5s、iphone6上出错

今天使用Label的时候,需要计算UILabel的高度,发现在4,4s上显示正常,在iPhone5s.iphone6上显示出错 使用的方法为: NSString *teacherComment = @"评语是写给学生看的,所以一方面评语要使用学生能看得懂的英语来写,所使用的词汇和语法不能过高或过低于学生的现有水平,要切合学生的实际水平,符合学生的个性心理..."; float commentHeight = 0.0; if ([teacherComment isEqual:@"

IOS 计算沙盒中一个目录的大小

项目中碰到一个需要计算沙盒目录的大小的功能. 看了下NSFileManager提供的方法,找到一个 <span style="font-size:18px;">- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error NS_AVAILABLE(10_5, 2_0); </span> 经过测试发现这个方法只能计算文件的大小,而不能直接计算文件夹的大小: 发现这

iOS 计算文字高度

#pragma mark-once 获取文字高度 - (CGSize)sizeWithmaxSize:(CGSize)size anText:(NSString *)anString { NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:anString]; NSMutableParagraphStyle *style = [[NSMutableParag

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

var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.font="30px Arial"; var txt="Hello World" ctx.fillText("width:" + ctx.measureText(txt).width,10,50) ctx.fillText(txt,10,100); 用法 me

iOS开发之计算文字尺寸

/** *  计算文字尺寸 * *  @param text    需要计算尺寸的文字 *  @param font    文字的字体 *  @param maxSize 文字的最大尺寸 */ - (CGSize)sizeWithText:(NSString *)text font:(UIFont *)font maxSize: (CGSize)maxSize { NSDictionary *attrs = @{NSFontAttributeName : font}; return [text

我在小学和中学里都遇到了很好的老师(背诵很重要,做事要规范,习惯很重要,习惯是靠平时每一个细节重复出来的)

我在小学和中学里都遇到了很好的老师,现在回想起来,对我帮助最大的地方有下面几点. 一,养成了作检查的习惯.我小学四年级的时候,遇到了一位极好的数学老师.那时候刚刚学习多位数乘法,很容易算错的.他教给我们用同余的原理,分别计算两个乘数和结果除9的余数,用来验算结果.方法很简单,也实际提高了考试的分数,但最使我受益终身的是,从此养成了进行验算的习惯,这在后来的学习和工作中对我的帮助极大.通常在得出一个结果之后,特别是经过复杂推导和计算才得出的,我都会试着另用某种近似的办法重新估算一次,作为验证. 二

iOS开发UI篇—实现一个私人通讯录小应用(二)

iOS开发UI篇—实现一个私人通讯录小应用(二) 一.实现功能说明 (1)点击注销按钮,弹出一个对话框,点击确定后移除当前栈顶的控制器,返回开始界面,点击取消,不做任何操作. 注意:注销按钮的单击事件已经进行了连线.实现-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex需要遵守UIActionSheetDelegate协议. 1 //注销按钮 2 - (IBActi