如何根據寬度來計算字體的大小
失效了
//使用時,font指定字體和最大字體大小,minFontSize指定最小字體,actualFontSize傳遞實際大小的引用。width指定總寬度,lineBreakMode指定換行模式。
- (CGSize)sizeWithFont:(UIFont *)font
minFontSize:(CGFloat)minFontSize
actualFontSize:(CGFloat *)actualFontSize
forWidth:(CGFloat)width
lineBreakMode:(UILineBreakMode)lineBreakMode
示例:
UILabel *_label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
[_label setNumberOfLines:0];
CGFloat fontSize;
NSString *testString = @"All hail Sakuya!" ;
UIFont *font = [UIFont systemFontOfSize:100];
[testString sizeWithFont:font
minFontSize:7.0f
actualFontSize:&fontSize
forWidth:(320)
lineBreakMode:NSLineBreakByCharWrapping];
[_label setFont:[UIFont systemFontOfSize:fontSize]];
[_label setText:testString];
[self.view addSubview:_label];
根據字體大小調整寬度高度(單行文字)
對於單行的UILabel,使用sizeToFit完全可以實現,
對於單行的CATextLayer,可以使用sizeWithFont計算大小
//公用屬性
UIFont *font = [UIFont systemFontOfSize:23.0];
NSString *text = @"mgen 一二三";
//UILabel
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 100, 50)];
lbl.backgroundColor = [UIColor greenColor];
lbl.font = font;
lbl.text = text;
[lbl sizeToFit];
//CATextLayer
CATextLayer *layer = [CATextLayer layer];
layer.frame = CGRectMake(50, 150, 100, 50);
layer.backgroundColor = [UIColor greenColor].CGColor;
layer.string = text;
layer.font = (__bridge CFTypeRef)font.fontName;
layer.foregroundColor = [UIColor blackColor].CGColor;
layer.fontSize = font.pointSize;
CGSize textSize = [text sizeWithFont:font];
CGRect frame = layer.frame;
frame.size = textSize;
layer.frame = frame;
[self.view addSubview:lbl];
[self.view.layer addSublayer:layer];
根據字體大小調整高度(指定行數文字,寬度不變)
多行且有行數限制的情況,UILabel有numberOfLines屬性,限定行數,然后使用sizetoFit
CATextLayer則沒有相應的屬性,所以然后在sizeWithFont:constrainedToSize:方法中把高度設置成一個較大的值,完成不限制行數的多行CATextLeyer。
//公用屬性
UIFont *font = [UIFont systemFontOfSize:17.0];
NSString *text = @"mgen 一二三 mgen 一二三 mgen 一二三 mgen 一二三 mgen 一二三 ";
//UILabel
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 150, 50)];
lbl.backgroundColor = [UIColor greenColor];
lbl.numberOfLines = 2;
lbl.font = font;
lbl.text = text;
[lbl sizeToFit];
//CATextLayer
CATextLayer *layer = [CATextLayer layer];
layer.frame = CGRectMake(50, 150, 150, 50);
layer.backgroundColor = [UIColor greenColor].CGColor;
layer.string = text;
layer.font = (__bridge CFTypeRef)font.fontName;
layer.foregroundColor = [UIColor blackColor].CGColor;
layer.fontSize = font.pointSize;
layer.wrapped = YES;
CGSize textSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(CGRectGetWidth(layer.frame), CGRectGetHeight(self.view.bounds))];
CGRect frame = layer.frame;
frame.size = textSize;
layer.frame = frame;
有一個太不合適的方法就是直接用UILabel的高度,也就是這樣:
CATextLayer沒有對戳斷字符的處理方式,雖然CATextLayer有truncationMode屬性,但是設置了沒有任何作用。
CGSize textSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(CGRectGetWidth(layer.frame), CGRectGetHeight(lbl.frame))];
根據字體大小,調整UILabel的高度,並折行顯示。
//公用屬性
UIFont *font = [UIFont systemFontOfSize:17.0];
NSString *text = @"可以更改此內容進行測試,寬度不變,高度根據內容自動調節";
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 150, 50)];
label.font = font; //UILabel的字體大小
label.numberOfLines = 0; //必須定義這個屬性,否則UILabel不會換行
label.textColor = [UIColor whiteColor];
label.textAlignment = NSTextAlignmentLeft; //文本對齊方式
[label setBackgroundColor:[UIColor redColor]];
//寬度不變,根據字的多少計算label的高度
// CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping];
CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(CGRectGetWidth(label.frame), CGRectGetHeight(self.view.bounds))];
//根據計算結果重新設置UILabel的尺寸
[label setFrame:CGRectMake(50, 50, size.width, size.height)];
label.text = text;
NSLog(@" %f %f ",150,size.height);
[self.view addSubview:label];
高度不變,根據字體多少,自動調整UILabel的寬度,並折行顯示
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 10, 20, 20)];
label.font = [UIFont boldSystemFontOfSize:20.0f]; //UILabel的字體大小
label.numberOfLines = 0; //必須定義這個屬性,否則UILabel不會換行
label.textColor = [UIColor whiteColor];
label.textAlignment = NSTextAlignmentLeft; //文本對齊方式
[label setBackgroundColor:[UIColor redColor]];
//高度固定不折行,根據字的多少計算label的寬度
NSString *str = @"高度不變獲取寬度,獲取字符串不折行單行顯示時所需要的長度";
CGSize size = [str sizeWithFont:label.font constrainedToSize:CGSizeMake(MAXFLOAT, label.frame.size.height)];
NSLog(@"size.width=%f, size.height=%f", size.width, size.height);
//根據計算結果重新設置UILabel的尺寸
[label setFrame:CGRectMake(0, 10, size.width, 20)];
label.text = str;