流程思想是:
用一个字符串对象来调用此方法,传进的size一般可以设置最大宽度,中间需要传入一个属性字典来告知字体和样式,然后根据字符串长度的多少来算出应该给多大的frame,此方法一般写成分类便于调用。
#import <UIKit/UIKit.h>
//采用分类的方法,方便在整个调用
@interface NSString (Size)
//提供一个类的接口,方便在整个项目中调用
+ (CGSize)sizeWithString:(NSString*)str andFont:(UIFont*)font andMaxSize:(CGSize)size;
@end
#import"NSString+Size.h"
@implementation NSString (Size)
//用对象的方法计算文本的大小
- (CGSize)sizeWithFont:(UIFont*)font andMaxSize:(CGSize)size {
//特殊的格式要求都写在属性字典中
NSDictionary*attrs =@{NSFontAttributeName: font};
//返回一个矩形,大小等于文本绘制完占据的宽和高。
return [self boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
}
+ (CGSize)sizeWithString:(NSString*)str andFont:(UIFont*)font andMaxSize:(CGSize)size{
NSDictionary*attrs =@{NSFontAttributeName: font};
return [str boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
}
@end
//测试代码
NSString*text =@"hdsfaajjkdlsakdsahdsjkjksdaljdkwos斯蒂芬妮圣诞快乐方能大量数据凯丰大厦浪费不带手机";
CGSize textSize = [NSString sizeWithString:text andFont:[UIFont systemFontOfSize:25] andMaxSize:CGSizeMake(270,MAXFLOAT)];
NSLog(@"%@",NSStringFromCGSize(textSize));
现在常规的动态行高的计算方法还是用(iOS 7)
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary *)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);
参数
size
宽高限制,用于计算文本绘制时占据的矩形块。可以使用该方法计算文本绘制所需的空间。size参数是一个constraint ,用于在绘制文本时作为参考。但是,如果绘制完整个文本需要更大的空间,则返回的矩形大小可能比size更大。一般,绘制时会采用constraint提供的宽度,但高度则会根据需要而定.
options
文本绘制时的附加选项NSStringDrawingOptions(iOS 6_0)
1 NSStringDrawingUsesLineFragmentOrigin
绘制文本时使用line fragement origin而不是baseline origin。
2 NSStringDrawingUsesFontLeading
计算行高时使用行距。(字体大小+行间距=行距)
3 NSStringDrawingUsesDeviceMetrics
计算布局时使用图元字形(而不是印刷字体)。
4 NSStringDrawingTruncatesLastVisibleLine
如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。如果没有指定选项,则该选项被忽略
context
context上下文。包括一些信息,例如如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数可为nil。
特殊情况
为了计算文本块的大小,该方法采用默认基线。
如果NSStringDrawingUsesLineFragmentOrigin未指定,矩形的高度将被忽略,同时使用单线绘制。(由于一个bug,在iOS6中,宽度会被忽略)