Отрегулируйте высоту UILabel в зависимости от текста - PullRequest
306 голосов
/ 15 января 2009

Предположим, у меня есть следующий текст в UILabel (длинная строка динамического текста):

Поскольку армия инопланетян значительно превосходит численность команды, игроки должны использовать постапокалиптический мир в своих интересах, таких как поиск укрытия за мусорными контейнерами, колоннами, машинами, обломками и другими объектами.

Я хочу изменить высоту UILabel's, чтобы текст мог уместиться. Я использую следующие свойства UILabel, чтобы сделать текст внутри для переноса.

myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;

Пожалуйста, дайте мне знать, если я не иду в правильном направлении. Спасибо.

Ответы [ 34 ]

0 голосов
/ 09 октября 2013

Когда включена функция AutoLayout, изменение размера не работает:)

0 голосов
/ 17 января 2014

Этот метод будет работать как для iOS 6, так и для 7

- (float)heightForLabelSize:(CGSize)maximumLabelSize  Font:(UIFont *)font String:(NSString*)string {

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:font forKey: NSFontAttributeName];

    CGSize adjustedLabelSize = [string maximumLabelSize
                                                                  options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin
                                                               attributes:stringAttributes context:nil].size;
    return adjustedLabelSize.height;
}
else {
    CGSize adjustedLabelSize = [string sizeWithFont:font constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByWordWrapping];

    return adjustedLabelSize.height;
}

}
0 голосов
/ 13 ноября 2013

Обновления по iOS7

// If description are available for protocol
protocolDescriptionLabel.text = [dataDictionary objectForKey:@"description"];
[protocolDescriptionLabel sizeToFit];
[protocolDescriptionLabel setLineBreakMode:NSLineBreakByWordWrapping];

CGSize expectedLabelSize = [protocolDescriptionLabel
               textRectForBounds:protocolDescriptionLabel.frame
               limitedToNumberOfLines:protocolDescriptionLabel.numberOfLines].size;
NSLog(@"expectedLabelSize %f", expectedLabelSize.height);

//adjust the label the the new height.
CGRect newFrame = protocolDescriptionLabel.frame;
newFrame.size.height = expectedLabelSize.height;
protocolDescriptionLabel.frame = newFrame;
0 голосов
/ 28 января 2014

Проблема в том, что ни одна из упомянутых функций не является реалистичной и для некоторой строки и шрифта вернет неверное значение высоты. Особенно не удастся приписать тексты.

Единственное реальное решение здесь: https://stackoverflow.com/a/4214978/699944, и смысл в том, чтобы использовать CoreText для ручного вычисления высоты каждой строки, чтобы получить правильный размер. Нет другого известного способа сделать это.

...