影响文本框的高和宽的因素:字体大小,文字大小,高度取决于是否限制了宽度,有没有限制最大的宽度和高度
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);
里面包括四个参数 size
、options
、attributes
、context
。size
:一个指定的矩形的大小,一般我们会指定一个矩形区域的Size,比如 CGSizeMake(100, 100)
,具体的值是根据需要来设置。
我一般使用CGSizeMake ('需要的宽度',CGFLOAT_MAX)
,这样会得到一个指定宽度动态高度的size。options
:这个是一个NS_OPTIONS
的枚举表示计算的类型
包括:
1.NSStringDrawingUsesLineFragmentOrigin
:绘制文本时整个文本将以每行组成的矩形为单位计算整个文本的尺寸。
2.NSStringDrawingUsesFontLeading
:根据字体计算高度
3.NSStringDrawingUsesDeviceMetrics
:计算文本尺寸时将以每个字或字形为单位来计算。
4.NSStringDrawingTruncatesLastVisibleLine
:这个目前我没怎么用过
一般使用NSStringDrawingUsesFontLeading
和NSStringDrawingUsesLineFragmentOrigin
的组合各个参数是可以组合使用的,如NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine
NSStringDrawingTruncatesLastVisibleLine:
如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。如果没有指定NSStringDrawingUsesLineFragmentOrigin选项,则该选项被忽略。
attribute
:包含一个
NSDictionary
类型的参数
Attributes
key值可以指定:
NSFontAttributeName(字体) 、NSParagraphStyleAttributeName(段落)
等;
id是key对应的值,比如字体
UIFont
,段落
NSParagraphStyle
等等。
context
:包括一些信息,例如如何调整字间距以及缩放。该参数一般可为 nil
-(CGSize)sizeWithString:(NSString *)str font:(UIFont *)font maxSize:(CGSize)maxSize
{
NSDictionary *dict=@{NSFontAttributeName:font};//attributes其实就是NSAttributeString的属性,是个字典类型的对象,包含一个NSDictionary类型的参数Attributeskey值可以指定:NSFontAttributeName(字体)NSParagraphStyleAttributeName(段落)等;id是key对应的值,比如字体UIFont,段落NSParagraphStyle等等。
//通常使用NSStringDrawingUsesLineFragmentOrigin,如果options参数为NSStringDrawingUsesLineFragmentOrigin,那么整个文本将以每行组成的矩形为单位计算整个文本的尺寸。
//size:限制尺寸,用于计算文本绘制时占据的矩形块,例如微博开发中size.w不超过scence.w。可以将size.y设置为无限大MAXFLOAT以便于显示所有文字内容。
// 设置文本的换行宽度self.contentLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 16;
//context :包括一些信息,例如如何调整字间距以及缩放。该参数一般可为 nil 。
CGSize size=[str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size;
return size;
}