boundingRectWithSize的使用-20170222小白学习记录

关于根据内容大小来进行文本高度的自适应,这一知识点,似乎似懂非懂,很是模糊,这不,今日决定非得把它弄懂50%,剩下的50%留着在以后去巩固^*^。

文本自适应高度用到的地方:自定义cell里面的Label,通常要显示较多的文字信息,label根据文字信息来灵活的调节cell的高度。应用的场景如聊天对话框,评论文本信息等。它需要计算出文字部分的尺寸,才能设计出合适的控件尺寸和位置。

首先来了解IOS 7.0计算文本尺寸的方法,用到的就是下面这一关键函数:

-(CGRect)boundingRectWithSize:(CGSize)size

                                          options:(NSStringDrawingOptions*)options

                                       attributes:(NSDictionary*)attributes

                                         context:(NSStringDrawingContext *)context

这是NSString的对象方法,一个字符串实例调用该方法时,方法会通过传入的参数返回一个CGRect型数据,这个数据的size就是此时字符串显示成文本的尺寸。


参数一、CGSize)size : 表示计算文本的最大宽高,就是限制的最大高度、宽度,一般情况下我们设置最大的宽度、高度不限制表示为:

CGSizeMake(getScreenWidth(), CGFLOAT_MAX)

注意:限制的宽度不同,计算的高度结果也不同.限制尺寸。


参数二、(NSStringDrawingOptions*)options:表示计算的类型,有四种类型:

1 .NSStringDrawingTruncatesLastVisibleLine:如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。如果NSStringDrawingUsesLineFragmentOrigin没有设置,则该选项不生效

2 .NSStringDrawingUsesLineFragmentOrigin:整个文本将以每行组成的矩形为单位计算整个文本的尺寸

3. NSStringDrawingUsesFontLeading:使用字体的行间距来计算文本占用的范围,即每一行的底部到下一行的底部的距离计算

4. NSStringDrawingUsesDeviceMetrics:将文字以图像符号计算文本占用范围,而不是以字符计算。也即是以每一个字体所占用的空间来计算文本范围

对于这四种类型的效果,可以多种类型组合使用:

a、如果options参数=NSStringDrawingUsesLineFragmentOrigin,那么整个文本将以每行组成的矩形为单位计算整个文本的尺寸。

(在这里有点奇怪,因为字体高度大概是13.8,textView中大概有10行文字,此时用该选项计算出来的只有5行,即高度为69。

b、如果options参数=NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin 却可以得出文字刚好有10行,即高度为138,

c、如果options参数=NSStringDrawingTruncatesLastVisibleLine

或者如果options参数= NSStringDrawingUsesDeviceMetric,那么计算文本尺寸时将以每个字或字形为单位来计算。

d、如果options参数=NSStringDrawingUsesFontLeading则以字体间的行距(leading,行距:从一行文字的底部到另一行文字底部的间距。)来计算。

以上具体可见iOS7计算文本尺寸新方法。


参数三、(NSDictionary*)attributes:文本的属性,如字体,文字样式(NSFontAttributeName、NSParagraphStyleAttributeName)。例如,

NSDictionary *dict = @{NSFontAttributeName : font}


参数四、(NSStringDrawingContext *)context:上下文。包括一些信息,例如如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数可为 nil 。

送上简单示例:


demo学习的新知识点:

NSLineBreakMode属性详解:用于多行和多行文本->字符截断类型(lineBreakMode //设置文字过长时的显示格式)

// NSParagraphStyle

typedef NS_ENUM(NSInteger, NSLineBreakMode) {

NSLineBreakByWordWrapping :以单词为显示单位显示,后面部分省略不显示。默认

NSLineBreakByCharWrapping,以字符为显示单位显示,后面部分省略不显示

NSLineBreakByClipping,剪切与文本宽度相同的内容长度,后半部分被删除

NSLineBreakByTruncatingHead, 前面部分文字以……方式省略,显示尾部文字内容。

NSLineBreakByTruncatingTail, 结尾部分的内容以……方式省略,显示头的文字内容

NSLineBreakByTruncatingMiddle 中间的内容以……方式省略,显示头尾的文字内容

}

未完待续。。。。

你可能感兴趣的:(boundingRectWithSize的使用-20170222小白学习记录)