2012-02-04 2 views
0

Я разрабатываю приложение iPhone с последней SDK и XCode 4,2Странного поведения при попытке выровнять вертикально UILabel текст

Я использую этот код для выравнивания по вертикали текста установить его ранее в UILabel. Вот код:

- (void)resizeLabel:(UILabel *)label 
{ 
    CGSize maximumLabelSize = label.frame.size; 

    CGSize expectedLabelSize = [label.text sizeWithFont:label.font 
             constrainedToSize:maximumLabelSize 
              lineBreakMode:label.lineBreakMode]; 

    //adjust the label the the new height. 
    CGRect newFrame = label.frame; 
    NSLog(@"NumLines: %d, OldWidth: %f, NewWidth: %f, OldHeight: %f, newHeight: %f", label.numberOfLines, maximumLabelSize.width, expectedLabelSize.width, maximumLabelSize.height, expectedLabelSize.height); 
    newFrame.size.height = expectedLabelSize.height; 
    label.frame = newFrame; 
} 

Для текста: "Iglesia-де-ла-Мерсед" я получаю:

NumLines: 2, OldWidth: 205.000000, NewWidth: 153.000000, OldHeight: 39.000000, newHeight: 21.000000 

Для текста: "Antiguo Convento-де-лос-merdarios" я получаю

NumLines: 2, OldWidth: 205.000000, NewWidth: 187.000000, OldHeight: 39.000000, newHeight: 42.000000 


Оба настроены на использование двух строк, но текст всегда рисуется в одной строке только.

Почему я получаю двойную высоту, когда expectedLabelSize.width меньше, чем maximumLabelSize.width?

ответ

1

Обертывание в двух строках, я думаю.

из doc:

Этот метод вычисляет показатели, необходимые для рисования заданной строки. Этот метод излагает текст получателя и пытается сделать , он соответствует указанному размеру, используя указанный шрифт и разрыв строки . Во время компоновки метод может разбить текст на несколько строк , чтобы сделать его лучше. Если текст получателя не полностью соответствует указанному размеру, он максимально выражает текст и усекает его (только для целей макета) в соответствии с указанным режимом разрыва строки. Затем он возвращает размер итоговой усеченной строки . Если высота, указанная в параметре размера , меньше одной строки текста, этот метод может возвращать значение высоты , которое больше указанного.

Что-то говоря:
если вы установите numberOfLines 0, он будет автоматически использовать столько строк, сколько возможно и необходимо.

Также попробуйте:

myUILabel.numberOfLines = 0; 
myUILabel.text = @"Antiguo convento de los merdarios"; 
[myUILabel sizeToFit]; 
+0

Да, я создал для двух линий в Interface Builder. – VansFannel

+0

'sizeWithFont: constrainedToSize: lineBreakMode:' не заботится о том, что вы делаете в nib-файлах. он просто вычисляет, что нужно. а для второго текста требуется 2 строки для содержащегося размера (ака максимальный размер). – vikingosegundo

+0

Я обновил свой вопрос, потому что, как вы можете видеть, оба настроены на использование двух строк, но второе - больше. – VansFannel

Смежные вопросы