Изменение размера UILabel для соответствия Word Wrap

Это часть приложения для iPhone, но в целом должна применяться к Какао, написанному на objC.

У меня есть UILabel, содержащая различное количество текста (от отдельных символов до нескольких предложений). Текст всегда должен отображаться как можно большим шрифтом, который соответствует всему тексту в UILabel. Максимальное количество строк установлено на 4, а режим разрыва строки установлен на перенос слов.

Так как используется несколько строк, AdjusttsFontSizeToFitWidth не будет работать для изменения размера текста.

Таким образом, я использую цикл для определения максимально возможного размера шрифта для каждой строки как таковой:

    //Set the text  
    self.textLabel.text = text;
    //Largest size used  
    NSInteger fsize = 200;  textLabel.font = [UIFont
    fontWithName:@"Verdana-Bold"
    size:fsize];

    //Calculate size of the rendered string with the current parameters
    float height = [text sizeWithFont:textLabel.font
        constrainedToSize:CGSizeMake(textLabel.bounds.size.width,99999) 
        lineBreakMode:UILineBreakModeWordWrap].height;

    //Reduce font size by 5 while too large, break if no height (empty string)
    while (height > textLabel.bounds.size.height and height != 0) {   
        fsize -= 5;  
        textLabel.font = [UIFont fontWithName:@"Verdana-Bold" size:fsize];   
        height = [text sizeWithFont:textLabel.font 
            constrainedToSize:CGSizeMake(textLabel.bounds.size.width,99999) 
            lineBreakMode:UILineBreakModeWordWrap].height;
    };

Этот подход хорошо работает по большей части. Исключение составляют длинные слова. Давайте возьмем строку @ "Опыт Foo." В качестве примера. Слово «опыт», будучи намного длиннее других, будет разбито пополам без правильной переноса слов, а строка разделена на 4 строки. Я ищу способ уменьшить размер так, чтобы каждое отдельное слово помещалось в одну строку.

Пример:

-old-

Размер шрифта: 60

The
Exper
ience
foo

должно быть

-new-

Размер шрифта: 30

The
Experience
foo

Вероятно, есть простой способ сделать это, но я бью стену.

Ответы на вопрос(4)

Ваш ответ на вопрос