Подтвердить что ты не робот

Вставить текст в UILabel

Вот мой код

 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;

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

//EDIT

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];
4b9b3361

Ответ 1

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

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 и ранее).

Ответ 2

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

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

    CGSize size = [labels sizeThatFits:CGSizeMake(_lblAddress.width, CGFLOAT_MAX)];
    label.height = size.height;

Ответ 3

[UILabel sizeToFit];

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

Ответ 4

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";

Ответ 5

Интерфейс Builder позволяет вам делать это сейчас.

  • В UILabel под Autoshrink выберите "Минимальный размер шрифта" вместо "Fixed Font Size".
  • Установите Минимальный размер шрифта как нечто разумное, например 8.
  • Вы также можете проверить галочку "Затянуть расстояние между буквами" .

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

label.adjustsFontSizeToFitWidth = YES;

Ответ 6

В 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, иначе он будет действительно запутан и новый размер не будет работать должным образом.

Ответ 7

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.