Отрегулируйте высоту UILabel в зависимости от текста
Считайте, что у меня есть следующий текст в UILabel
(длинная строка динамического текста):
Так как армия инопланетян значительно превосходит численность команды, игроки должны использовать постапокалиптический мир в своих интересах, таких как поиск укрытия за мусорными контейнерами, колоннами, машинами, обломками и другими объектами.
Я хочу изменить размер UILabel's
высота, чтобы текст мог поместиться. Я использую следующие свойства UILabel
сделать текст внутри, чтобы обернуть.
myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;
Пожалуйста, дайте мне знать, если я не в правильном направлении. Благодарю.
34 ответа
Этот метод будет работать как для 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;
}
}
Проблема заключается в том, что ни одна из упомянутых функций не является реалистичной, и для некоторой строки и шрифта будет возвращено неверное значение высоты. Особенно не удастся приписать тексты.
Единственное реальное решение здесь: /questions/22653584/ctframesettersuggestframesizewithconstraints-core-text-kazhdyij-raz-vozvraschaet-nevernyij-razmer/22653590#22653590 и суть в том, чтобы использовать CoreText для ручного вычисления высоты каждой строки, чтобы получить правильный размер. Нет другого известного способа сделать это.
Обновления по 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;