iOS开发:boundingRectWithSize计算文字大小问题

来源:互联网 发布:淘宝好评返现素材 编辑:程序博客网 时间:2024/05/22 01:42

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

1.针对对富文本计算NSAttributedString

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

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

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

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

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


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

NSStringDrawingUsesLineFragmentOrigin绘制文本时使用 line fragement origin 而不是 baseline origin。一般使用这项

NSStringDrawingUsesFontLeading 根据字体计算高度

NSStringDrawingUsesDeviceMetrics 使用象形文字计算高度

NSStringDrawingTruncatesLastVisibleLine 如果NSStringDrawingUsesLineFragmentOrigin设置,这个选项中没有用

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

参数四:NSStringDrawingContext

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


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

解决办法1:检测字体和限制的宽度是否设置正确

解决办法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转义字符出现的个数 * 单行文本的高度。



以上是个人经验以及网站资料总结,有什么问题希望大家相互交流,只为大家提供更多的资源分享,让我们的问题不在头痛



文/崖边树(简书作者)
原文链接:http://www.jianshu.com/p/0734d2fa74bd


0 0
原创粉丝点击