Подогнать текст в UILabel - PullRequest
       11

Подогнать текст в UILabel

38 голосов
/ 01 февраля 2012

Вот мой код

 UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 50, 300, 50)];
    label.textAlignment = UITextAlignmentCenter;
    label.backgroundColor = [UIColor clearColor];
    label.textColor = [UIColor whiteColor];
    label.textColor.font = [UIFont fontWithName:@"Verdana" size:30];
    label.text = @"A very long string";
     etc...

Проблема в том, что шрифт большой и не помещается на этикетке.Он просто отображает «очень»

Что делать, чтобы весь текст отображался.Я пробовал

label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;

Но у меня это не работает.Я хочу сделать это программно.

// РЕДАКТИРОВАТЬ

CGRect frame = CGRectMake(10, 50, 300, 50);
    NSString *labelString = @"Players.";

    UILabel *howManyUsersLabel = [[UILabel alloc]initWithFrame:frame];
    howManyUsersLabel.textAlignment = UITextAlignmentCenter;
    howManyUsersLabel.backgroundColor = [UIColor clearColor];
    howManyUsersLabel.textColor = [UIColor whiteColor];
    howManyUsersLabel.adjustsFontSizeToFitWidth = NO;
    howManyUsersLabel.numberOfLines = 0;

    CGFloat fontSize = 30;
    while (fontSize > 0.0)
    {
        CGSize size = [labelString sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(frame.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];

        if (size.height <= frame.size.height) break;
        fontSize -= 1.0;
        NSLog(@"test");
    }

    howManyUsersLabel.font = [UIFont fontWithName:@"Verdana" size:fontSize];

Ответы [ 7 ]

89 голосов
/ 01 февраля 2012

Я думаю, вам просто нужно добавить это:

label.adjustsFontSizeToFitWidth = YES;
label.minimumFontSize = 0;

Тогда размер текста автоматически изменится в соответствии с меткой.

Обратите внимание, что это действительно будет работать, только если label.numberOfLines = 1, так что текст будет в одной строке.

Если вам нужно, чтобы текст был перенесен на несколько строк, но при этом уменьшился до нужного размера, решение будет более сложным. Для этого вам необходимо рассчитать размер отрисовки текста, а затем уменьшить его в цикле следующим образом:

NSString *theText = @"A long string";
CGRect labelRect = CGRectMake(10, 50, 300, 50);
label.adjustsFontSizeToFitWidth = NO;
label.numberOfLines = 0;

CGFloat fontSize = 30;
while (fontSize > 0.0)
{
    CGSize size = [theText sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(labelRect.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];

    if (size.height <= labelRect.size.height) break;

    fontSize -= 1.0;
}

//set font size
label.font = [UIFont fontWithName:@"Verdana" size:fontSize];

Это в основном просто уменьшает размер шрифта, пока он не уместится на этикетке.

UPDATE:

Начиная с iOS7, многострочный текст также будет автоматически уменьшаться при adjustsFontSizeToFitWidth = YES, поэтому вторая часть этого ответа больше не нужна (если только вы не поддерживаете iOS 6 и более ранние версии).

3 голосов
/ 25 сентября 2014

Наконец-то у меня есть решение проблемы выравнивания текста на арабском языке, которое вы просто делаете так:

    label.text = @"هذا هو نص طويل جدا";
    label.textAlignment = NSTextAlignmentNatural;

    CGSize size = [labels sizeThatFits:CGSizeMake(_lblAddress.width, CGFLOAT_MAX)];
    label.height = size.height;
1 голос
/ 24 сентября 2014
[UILabel sizeToFit];

Это будет работать для вашей проблемы.

0 голосов
/ 01 декабря 2015

Swift с iOS 9

let maxFontSize: CGFloat = 40
let minFontSize: CGFloat = 10

label.font = UIFont(name: label.font.fontName, size: maxFontSize)!
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = minFontSize/maxFontSize

Это не увеличивает размер шрифта для заполнения метки.Он начинается с максимального размера и уменьшается по мере необходимости до минимума.Это также предполагает, что количество строк равно 1.

0 голосов
/ 02 июня 2015

В iOS 8 все кажется сломанным (вероятно, и в iOS 7).

Решение:

-(UIFont*)fontForString:(NSString*)string toFitInRect:(CGRect)rect seedFont:(UIFont*)seedFont {
    UIFont* returnFont = seedFont;
    CGSize stringSize = [string sizeWithAttributes:@{NSFontAttributeName : seedFont}];

    while(stringSize.width > rect.size.width){
        returnFont = [UIFont systemFontOfSize:returnFont.pointSize -1];
        stringSize = [string sizeWithAttributes:@{NSFontAttributeName : returnFont}];
    }

    return returnFont;
}

Удостоверьтесь, что вы не пытаетесь использовать label.adjustsFontSizeToFitWidth = YES, иначе это будет действительно запутано, и новый размер не будет работать должным образом.

0 голосов
/ 17 июля 2014

Interface Builder позволяет вам сделать это сейчас.

  1. В UILabel в разделе «Автоматическое сжатие» выберите «Минимальный размер шрифта» вместо «Фиксированный размер шрифта».
  2. Установите Минимальный размер шрифта , чтобы он был чем-то разумным, например 8.
  3. Вы также можете поставить галочку «Затянуть интервал между буквами» .

В качестве альтернативы вы можете сделать это программно:

label.adjustsFontSizeToFitWidth = YES;
0 голосов
/ 02 февраля 2012
CGRect titleRect        = CGRectMake(10, 50, 300, 50);

UILabel *textTitleView  = [[UILabel alloc] initWithFrame:titleRect];

textTitleView.numberOfLines = 3  //for multiple lines;

textTitleView.lineBreakMode = UILineBreakModeWordWrap;

[UIFont fontWithName:@"Verdana" size:30];

textTitleView.text          = @"your text";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...