Почему это нарушает UILabel adjustsFontSizeToFitWidth?

iOS 7, Xcode 5

используя UILabel, этот код работает (autosizes текст, чтобы соответствовать):

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 ответов


UILabel будет регулировать размер шрифта для многострочного текста, если вы установите;

  1. numberOfLines к ненулевому значению.
  2. lineBreakMode to NSLineBreakMode.ByTruncatingTail.

например,

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

протестировано и подтверждено для работы с;

  • Xcode 7.1.1
  • iPhone 6 устройство с iOS 9.0.1
  • симулятор iPhone 4S с iOS 8.4
  • iPhone 4s симулятор с iOS 8.1

Ну, похоже, что это в основном ошибка, возможно, исправлена в 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;
        }
    }
}

то же самое случилось со мной, я использую нестандартный шрифт :

         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


из-за использования

self.testLabel.lineBreakMode=NSLineBreakByWordWrapping;

каждое слово становится его собственной линии (в вашем случае)