iOS 动态计算行高,宽等

Posted cathy0913

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 动态计算行高,宽等相关的知识,希望对你有一定的参考价值。

UILabel有两个计算文字大小的方法:

1.针对对富文本计算NSAttributedString

- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary*)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);

2.针对与普通文本计算NSString

- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 6_0);

 

对于这两个方法有相同的参数:

 

参数一:size表示计算文本的最大宽高(就是限制的最大高度、宽度),一般情况下我们设置最大的宽度、高度不限制CGSizeMake(getScreenWidth(), CGFLOAT_MAX),注意:限制的宽度不同,计算的高度结果也不同。

参数二: options表示计算的类型

NSStringDrawingUsesLineFragmentOrigin:绘制文本时使用 line fragement origin 而不是 baseline origin。一般使用这项。整个文本将以每行组成的矩形为单位计算整个文本的尺寸( The specified origin is the line fragment origin, not the base line origin)        

NSStringDrawingUsesFontLeading:根据字体计算高度,使用字体的行间距来计算文本占用的范围,即每一行的底部到下一行的底部的距离计算 ( Uses the font leading for calculating line heights  )

NSStringDrawingUsesDeviceMetrics:使用象形文字计算高度,将文字以图像符号计算文本占用范围,而不是以字符计算。也即是以每一个字体所占用的空间来计算文本范围  (Uses image glyph bounds instead of typographic bounds  )

NSStringDrawingTruncatesLastVisibleLine:如果NSStringDrawingUsesLineFragmentOrigin设置,这个选项没有用,当文本不能适合的放进指定的边界之内,则自动在最后一行添加省略符号。如果NSStringDrawingUsesLineFragmentOrigin没有设置,则该选项不生效  (Truncates and adds the ellipsis character to the last visible line if the text doesn‘t fit into the bounds specified. Ignored if NSStringDrawingUsesLineFragmentOrigin is not also set.  )

参数三:attributes 表示富文本的属性NSAttributedString.h比如字体、文字样式NSFontAttributeNameNSParagraphStyleAttributeName

参数四:NSStringDrawingContext
When stringDrawingContext=nil, it‘s equivalent of passing the default instance initialized with [[NSStringDrawingContext alloc] init] context
上下文,包括一些信息,例如如何调整字间距以及缩放。该参数一般可为 nil 。


问题:有时候计算文字的时候大小和实际的大小不一样?

解决办法1:检测字体和限制的宽度是否设置正确(楼主载在这里/(ㄒoㄒ)/~~)

解决办法2:可以设置NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
(注意:swift中要写这样的组合是不支持的,点击这里查看解决方法www.jianshu.com/p/545f7f1d8741)

解决办法3:当你是把获得的高度来布局控件的View的高度的时候,需要把获得size = [string boundingRectWithSize:CGSizeMake(getScreenWidth(), CGFLOAT_MAX) options:options context:nil].size转化为ceilf(size.height)

解决办法4:由于这个方法计算字符串的大小的通过取得字符串的size来计算, 如果你计算的字符串中包含\n\r 这样的字符,也只会把它当成字符来计算。但是在显示的时候就是\n是转义字符,那么显示的计算的高度就不一样了,所以可以采用:计算的高度 = boundingRectWithSize计算出来的高度 + \n\r转义字符出现的个数 * 单行文本的高度。

扩展:

TextKit学习(四)通过boundingRectWithSize:options:attributes:context:计算文本尺寸:http://blog.csdn.net/jymn_chen/article/details/10949279

Text Kit学习(入门和进阶)http://www.cocoachina.com/industry/20131028/7250.html




以上是关于iOS 动态计算行高,宽等的主要内容,如果未能解决你的问题,请参考以下文章

不使用 AutoLayout 的 UITableView 动态行高

如果在项目中启用了大小类,则无法使用约束计算行高?

tableView计算动态行高的总结

iOS UITableView 解决估算行高和指定行高的矛盾

POI导出excel:设置字体颜色行高自适应列宽自适应锁住单元格合并单元格...

iOS给文本设置属性,并且计算文字行高