兩個方法:
- (CGSize)sizeWithAttributes:(nullable NSDictionary<NSString *, id> *)attrs NS_AVAILABLE(10_0, 7_0);
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);
eg1:
- (void)viewDidLoad { [super viewDidLoad]; NSString *str = @"原紗央莉選擇了加入AV界為自己謀求穩定的工作,並且選擇了SOD作為自己的東家。在2008年11月25日sabra雜誌裡當時原紗央莉連載的專欄“SAORIchewBE”裡公開了要加入AV的事情。"; //設定按照什麼字型大小來計算,你可以添加其他的屬性 NSDictionary *attrs = @{NSFontAttributeName : [UIFont systemFontOfSize:25]}; //label1 UILabel *label1 = [[UILabel alloc]init]; label1.backgroundColor = [UIColor yellowColor]; CGSize size1 = [str sizeWithAttributes:attrs];//方法1,計算大小,但是只有一行 label1.frame = (CGRect){{50,50},size1}; label1.text = str; [self.view addSubview:label1]; //label2 UILabel *label2 = [[UILabel alloc]init]; label2.backgroundColor = [UIColor purpleColor]; CGSize size2 = CGSizeMake(200, MAXFLOAT);//給出一個限制size,設定寬度200,高度可變 CGRect rect2 = [str boundingRectWithSize:size2 options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil];//方法2,計算大小,但是會根據size2來限制 CGFloat label2_H = rect2.size.height; label2.frame = CGRectMake(50, 100, size2.width, label2_H); [self.view addSubview:label2]; label2.text = str; label2.numberOfLines = 0; //label1和label2都沒有設定字型的大小,所以你會感覺label有很多空白,看label3 //label3設定了字型大小,因為預設的字型大小小於25,所以label1和label2都有空白,現在設定label3的字型和計算依據的字型一樣大,看效果 UILabel *label3 = [[UILabel alloc]init]; label3.backgroundColor = [UIColor grayColor]; CGSize size3 = CGSizeMake(200, MAXFLOAT); CGRect rect3 = [str boundingRectWithSize:size2 options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil];//方法2 CGFloat label3_H = rect3.size.height; label3.frame = CGRectMake(150, 300, size3.width, label3_H); [self.view addSubview:label3]; label3.font = [UIFont systemFontOfSize:25];//相比label2多了這句代碼 label3.text = str; label3.numberOfLines = 0;}