个人总结:

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. cpu时间 / cpu利用率计算

    CPU时间即反映CPU全速工作时完成该进程所花费的时间 cpu时间计算CPU TIME = (# of CPU Clock Cycles) x Clock Period     // “#” 表示消耗 ...

  2. Java Jaxb JavaBean与XML互转

    1.Jaxb - Java Arcitecture for XML Binding 是业界的一个标准,是一项能够依据XML Schema产生Java类的技术. Jaxb2.0是Jdk1.6的组成部分. ...

  3. No enclosing instance of type Demo is accessible. Must qualify the allocation with an enclosing instance of type Demo (e.g. x.new A() where x is an instance of Demo).

    No enclosing instance of type Demo is accessible. Must qualify the allocation with an enclosing inst ...

  4. sqlite 小刀 初试

    SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经在很多嵌入式产 ...

  5. Docker运行报Cannot connect to the Docker daemon错误

    核心问题所在:权限不足 操作docker命令提示:Cannot connect to the Docker daemon 请切换管理员权限,root权限,root安装的一般的用户访问会存在此问题.

  6. 使用Wifi连接ADB调试App

    前提:你的手机ROOT过,做Android开发的,别跟人说你的手机不是ROOT的. 步骤:   1.在手机上把ADB服务进程的TCP端口设置为5555,这是Android ADB的默认调试商品.这需要 ...

  7. 使用struct与使用class初始化对象效率对比

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  8. C语言 (内存) 四道经典题目

    void GetMemory(char *p) { p = (); "没有释放内存" } void Test(void) { char *str = NULL; GetMemory ...

  9. python-简单函数小例子 单位转换

    第一种方法def fahrenheit_converter(g): fahrenheit = g /1000 return str(fahrenheit) + 'kg' #调用函数g2kg = fah ...

  10. 常用 cdn

    http://www.bootcdn.cn/ jquery <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.j ...