个人总结:

Computing Metrics for a Single Line of Text
– sizeWithFont: 同下面,换行方式默认取NSLineBreakByWordWrapping
– sizeWithFont:forWidth:lineBreakMode: 将字符串放入指定宽度,如果不够,就依据换行方式截断字符串,返回其大小。
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:将字符串放入限定宽度内,不足,就缩小字体,直至放下,返回此时的字符串大小和字体大小;缩小到最小还不能放下,就截断字符串,返回其大小和字体大小。设置高度没有什么意义,因为高度值再大也只能显示一行,再小也要显示一行。


Computing Metrics for Multiple Lines of Text
– sizeWithFont:constrainedToSize: 同下面,换行方式默认取NSLineBreakByWordWrapping
– sizeWithFont:constrainedToSize:lineBreakMode:用于多行,指定限制,换行方式,字体大小。限制大小的宽度值和换行方式影响换行,进而影响结果的高度值。限制大小的高度值会影响内容显示的多少,大于实际所需,没影响;小于的话,字符串只能显示一部分,直至只能显示一行.

注意:指定的限制只是一个评估值,例如在多行里,我设定宽度限制120,高度无限,换行方式NSLineBreakByWordWrapping,那么最终输出的宽度值是118。因为对于某个字体大小,它不会刚好填满你指定的宽度。此外,除了– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:会改变字体大小的情况外,字体大小指定时,无论换行方式如何,是多行还是单行,最终的高度都是和字体所需的高度成1倍或者n倍关系。

以下为参考文献:iOS学习:UILabel和sizeWithFont方法

http://www.cnblogs.com/zouzf/archive/2012/11/21/2780040.html

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. // Do any additional setup after loading the view, typically from a nib.
  5. NSString *text = @"tw ia nwifei xantianwif eixan tianwi feixan";
  6. //设置字体,包括字体及其大小
  7. UIFont *font = [UIFont fontWithName:@"Arial" size:50.0f];
  8. //label可设置的最大高度和宽度
  9. CGSize maxSize = CGSizeMake(320.f, MAXFLOAT);
  10. //字符串在指定区域内按照指定的字体显示时,需要的高度和宽度(宽度在字符串只有一行时有用)
  11. //一般用法:指定区域的宽度而高度用MAXFLOAT,则返回值包含对应的高度
  12. //如果指定区域的宽度指定,而字符串要显示的区域的高度超过了指定区域的高度,则高度返回0
  13. //核心:多行显示,指定宽度,获取高度
  14. CGSize labelSize = [text sizeWithFont:font
  15. constrainedToSize:CGSizeMake(320.f, MAXFLOAT)
  16. lineBreakMode:NSLineBreakByWordWrapping];
  17. //指定用于显示的区域
  18. CGRect rect = CGRectMake(0.0f, 0.0f, labelSize.width, labelSize.height);
  19. //CGRectZero表示(0,0,0,0),即留待后面再设置
  20. UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectZero];
  21. //label默认只显示一行,把numberofline设为0,即表示不限制行数,根据实际显示
  22. [myLabel setNumberOfLines:0];
  23. myLabel.frame = rect;
  24. myLabel.text = text;
  25. myLabel.font = font;
  26. myLabel.textColor = [UIColor grayColor];
  27. //把label加入到view里,这样才能显示
  28. [self.view addSubview:myLabel];
  29. //引用计数减一,因为在上一行 addSubview 时,view已经把mylabel的引用计数加一了
  30. [myLabel release];
  31. }
  32. -(void)test
  33. {
  34. NSString *text = @"asfawlfaw;lojf";
  35. UIFont *font = [UIFont fontWithName:@"Arial" size:20.0f];
  36. //字符串在指定区域内按照指定的字体显示时,需要的高度和宽度(宽度在字符串只有一行时有用)
  37. //一般用法:指定区域的宽度而高度用MAXFLOAT,则返回值包含对应的高度
  38. //如果指定区域的宽度指定,而字符串要显示的区域的高度超过了指定区域的高度,则高度返回0
  39. //核心:多行显示,指定宽度,获取高度
  40. CGSize labelSize = [text sizeWithFont:font
  41. constrainedToSize:CGSizeMake(320.f, MAXFLOAT)
  42. lineBreakMode:NSLineBreakByWordWrapping];
  43. //字符串用指定字体进行单行显示时,需要的高度和宽度
  44. CGSize size1 = [text sizeWithFont:font];
  45. //字符串用指定字体在指定区域进行单行显示时,需要的高度和宽度;
  46. //一般的用法是,指定区域的高度固定而宽度用MAXFLOAT,则返回值包含对应的宽度
  47. //如果指定区域的宽度不够,则宽度返回0;高度不够则没影响
  48. //核心:单行显示,指定区域的宽度要够大,获取宽度
  49. CGSize size2 = [text sizeWithFont:font
  50. constrainedToSize:CGSizeMake(MAXFLOAT, 100.0f)];
  51. //字符串用指定字体指定宽度和指定换行方式显示时,需要的高度和宽度
  52. //虽然指定了换行方式,在实际计算时也会换行,但返回结果只会返回第一行的高度和宽度
  53. //如果指定宽度小于字符串宽度,则宽度返回0
  54. //核心:貌似没有什么用
  55. CGSize size3 = [text sizeWithFont:font
  56. forWidth:400.0f
  57. lineBreakMode:NSLineBreakByWordWrapping];
  58. CGFloat f = 0.0f;
  59. //虽然指定了换行方式,在实际计算时也会换行,但返回的结果只是第一行的高度很宽度
  60. //指定了应该显示的字体,最小的字体,实际的字体,在实际计算中,如果宽度不够,则尽量缩小字符串的字体直至能够一行全部显示,如果缩到最小还不能完全显示字符串,则进行截断,返回截断后的字符串的高度和宽度
  61. //字体实际的大小,存放在 actualFontSize里
  62. CGSize size4 = [text sizeWithFont:font
  63. minFontSize:10.0f
  64. actualFontSize:&f
  65. forWidth:100.0f
  66. lineBreakMode:NSLineBreakByWordWrapping];
  67. }

sizeWithFont:方法使用明细的更多相关文章

  1. sizeWithFont方法被弃用了,该怎么办?

    之前使用了NSString类的sizeWithFont:constrainedToSize:lineBreakMode:方法,但是该方法已经被iOS7 Deprecated了,而iOS7新出了一个bo ...

  2. sizeWithFont 不是线程安全。

    在ios开发中经常使用用sizeWithFont 方法来计算UILabel 的frame, 例如动态计算UITableViewCell 的高度,在主线程处理没有问题,但是在子线程用此方法来计算就会出现 ...

  3. 通用访问 - 用“反射”来设计通用的通信协议,以及配套的SDK、工具

    1. 效果演示 2. 通信协议 功能介绍 特点 TCP协议 WebApi协议 3. SDK与工具 4. 应用示例 迷你网管 通用GIS 系统管理 5. 设计初衷与演化   1. 效果演示     服务 ...

  4. Java反射与动态代理

    Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制.java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的 ...

  5. GZFramwork快速开发框架演练之会员系统(四)添加商品管理

    1.1:创建表结构 新建三张商品关联的表,表模型如下: 创建SQL语句略 1.2:生成表Model(生成方法见上一节) 1.3:生成tb_ProductType的单结构界面然后添加到项目中 1.4:修 ...

  6. 根据NSString字符串长度自动改变UILabel的frame

    相信大家都遇到过这种需求.如果一个不慎,容易做成这个模样: 话不多说,上代码. 1.首先,设置UILabel的相关属性 UILabel *tmpLabel = [[UILabel alloc] ini ...

  7. php最新微信扫码在线支付接口。ecshop和shopex,shopnc下完美无错

    最近为客户的一个在线商城做了一个微信扫码在线支付的接口.跟大家分享一下. 1 首先可以模仿其他的接口,比如支付宝,财付通等的接口,构建模块功能文件和语言文件.2 微信提供2种扫码方式,大家可以根据自己 ...

  8. ionic搭建与基础

    ionic搭建与基础 一.环境搭建 安装 npm install -g cordova npm install -g ionic 创建 项目 ionic start MyProject blank i ...

  9. C# 自定义类型通过实现IFormattable接口,来输出指定的格式和语言文化的字符串(例:DateTime)

    常规的调用ToString()方法,存在两个问题. (1).调用者无法控制字符串的格式 (2).调用者不能方便的选择一种特定的语言文化来格式化字符串. 在开发一些国际化的应用时,应用程序需要调用与当前 ...

随机推荐

  1. 【DB2】NVL2函数

    语法: NVL2(表达式1,表达式2,表达式3) 如果表达式1为空,返回值为表达式3的值.如果表达式1不为空,返回值为表达式2的值. 例子: SELECT ID, NVL2(SEX,'非空','空值' ...

  2. 06-hibernate注解-一对多单向外键关联

    一对多单向外键 1,一方持有多方的集合,一个班级有多个学生(一对多). 2,@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY ) / ...

  3. php引用(&)变量引用,函数引用,对象引用和参数引用用法

    php引用(&)变量引用,函数引用,对象引用和参数引用用法   php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的名字访问同一个变量内容.与C语 ...

  4. 如何把HTML标记分类

    p.h1.或div等元素常常称为块级元素,这些元素显示为一块内容:Strong,span等元素称为行内元素,它们的内容显示在行中,即“行内框”.(可以使用display=block将行内元素转换成块元 ...

  5. 对于yum中没有的源的解决办法-EPEL

    转载自:http://6260022.blog.51cto.com/6250022/1698352 EPEL 是什么? EPEL (Extra Packages for Enterprise Linu ...

  6. Linux之IO Redirection

    一.引言 前几天使用一个linux下的内存检测工具valgrind,想要把检测的结果重定向到文件,结果总是没有任何内容,最后才发现是重定向的原因,它输出的信息是输出到stderr的,所以我使用 > ...

  7. iOS 给tableView设置contentInset不生效?

    给tableView设置contentInset的时候如果tableView中内容比较多,超过一个屏幕,设置的contentInset是生效的,但是呢,如果页面内容比较少,我们会发现设置content ...

  8. Linux svn仓库备份到Windows机器上

    Linux svn仓库备份到Windows机器上 1,需求说明,Linux作为主库(A),Windows作为本地备份库(B),要求每天将Linux库中的代码备份到本地 2,B机器上安装svn服务端 3 ...

  9. Hive分析窗体函数之SUM,AVG,MIN和MAX

    行 AVG(pnum) OVER(PARTITION BYpolno ORDER BY createtime ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOW ...

  10. 解决windows server 2008 r2 右键没有个性化

    装完系统发现桌面上只有一个回收站我的电脑 网络邻居 控制板面都没有好像win7家庭版也没有右键–个性化设置上google百度了下 也还漫简单的点左下角的开始-运行:"C:\Windows\s ...