字體大小調整(UILabel、CATextLayer)


如何根據寬度來計算字體的大小

失效了

//使用時,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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM