关于根据内容大小来进行文本高度的自适应,这一知识点,似乎似懂非懂,很是模糊,这不,今日决定非得把它弄懂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 中间的内容以……方式省略,显示头尾的文字内容
}
未完待续。。。。