为什么这会破坏UILabel adjustsFontSizeToFitWidth?

时间:2014-07-08 16:20:51

标签: ios objective-c

iOS 7,Xcode 5

使用UILabel,此代码有效(自动调整文本以适应):

self.testLabel.numberOfLines=0;
self.testLabel.lineBreakMode=NSLineBreakByWordWrapping;
self.testLabel.adjustsFontSizeToFitWidth=YES;
self.testLabel.minimumScaleFactor=0.1;
self.testLabel.textAlignment=NSTextAlignmentCenter;
[self.testLabel.font fontWithSize:100.0];

enter image description here

但是添加“setFont”行会导致它无法缩放字体以适应:

[self.testLabel setFont:[UIFont fontWithName:@"Helvetica Neue" size:62.0f]]; //THIS LINE CAUSES THE FONT SCALING TO FAIL
self.testLabel.numberOfLines=0;
self.testLabel.lineBreakMode=NSLineBreakByWordWrapping;
self.testLabel.adjustsFontSizeToFitWidth=YES;
self.testLabel.minimumScaleFactor=0.1;
self.testLabel.textAlignment=NSTextAlignmentCenter;
[self.testLabel.font fontWithSize:100.0];

enter image description here

有没有人知道这个问题的解决办法?

4 个答案:

答案 0 :(得分:19)

如果您设置,

UILabel将调整多行文字的字体大小;

  1. numberOfLines为非零值。
  2. lineBreakModeNSLineBreakMode.ByTruncatingTail
  3. 例如,

        _label.numberOfLines                =   2
        _label.lineBreakMode                =   NSLineBreakMode.ByTruncatingTail
        _label.adjustsFontSizeToFitWidth    =   true
        _label.minimumScaleFactor           =   0.4
    

    经过测试并确认可以使用;

    • Xcode 7.1.1
    • 带有iOS 9.0.1的iPhone 6设备
    • iOS 4的iPhone 4S模拟器
    • iOS 8.1的iPhone 4S模拟器

答案 1 :(得分:2)

好吧,看起来这基本上是一个bug,可能在Xcode 6中修复了。 这适用于iOS 7 - 我没有在任何其他版本中测试它。

与此同时,这是我用来缩小文字以适应我的UILabel的方法, 多行和AttributedString:

-(void)whAlertDisplayTheNotice:(UILabel*)inputlabel theNotice:(NSString*)theNotice {
    float maxFontSize=80.0;
    NSRange tmpRange=NSMakeRange(0,theNotice.length);
    NSMutableParagraphStyle *paragraph=[[NSMutableParagraphStyle alloc]init];
    paragraph.lineBreakMode=NSLineBreakByWordWrapping;
    paragraph.alignment=NSTextAlignmentCenter;
    paragraph.maximumLineHeight=maxFontSize;
    paragraph.lineSpacing=0;

    NSMutableAttributedString *attString=[[NSMutableAttributedString alloc] initWithString:theNotice];
    [attString addAttribute:NSParagraphStyleAttributeName
                      value:paragraph
                      range:tmpRange];
    [attString addAttribute:NSForegroundColorAttributeName
                      value:[UIColor blackColor]
                      range:tmpRange];

    CGSize constraintSize=CGSizeMake(inputlabel.frame.size.width, CGFLOAT_MAX);
    CGRect labelSize;
    for(short i=maxFontSize; i>8; i--){
        [attString addAttribute:NSFontAttributeName
                          value:[UIFont fontWithName:@"MV Boli" size:i]
                          range:tmpRange];
        inputlabel.attributedText=attString;
        labelSize=[inputlabel.attributedText boundingRectWithSize:constraintSize
                                                          options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                                          context:nil];
        if(labelSize.size.height<inputlabel.frame.size.height){
            NSLog(@"fontsize is:%li",(long)i);
            break;
        }
    }
}

答案 2 :(得分:1)

同样的事情发生在我身上,我使用的是非标准字体:

         titleLabel.font = [UIFont fontWithName:@"IRANSans" size:27 ];
         titleLabel.numberOfLines = 1;
         titleLabel.minimumScaleFactor = 0.01;
         titleLabel.adjustsFontSizeToFitWidth = YES;

我发现问题是UILabel的大小,它的自我也在增长,我只是添加了一个约束来保持标签的宽度固定,然后它就像一个魅力。 附:我在xcode 7.1,iOS 9.2.1

答案 3 :(得分:0)

因为使用

self.testLabel.lineBreakMode=NSLineBreakByWordWrapping;

每个单词都成为他自己的行(在你的情况下)