Как найти фактическое количество строк UILabel?

Как я могу найти фактическое количество строк UILabel после того, как я инициализировал его text и font ? Я установил свойство numberOfLines 0 , поэтому он будет расширяться до тех пор, пока не потребуется много строк. Но тогда, как я могу узнать, сколько строк оно наконец получило после того, как я установил его text ?

Я нашел похожие вопросы, но ни один из них не дает краткого ответа, и мне кажется, что это должно быть действительно легко получить без каких-либо накладных расходов при манипуляции с boundingRectWithSize или sizeWithFont , …

7 Solutions collect form web for “Как найти фактическое количество строк UILabel?”

Сначала установите текст в UILabel

Первый вариант:

Сначала вычислите высоту текста в соответствии с шрифтом:

 NSInteger lineCount = 0; CGSize labelSize = (CGSize){yourLabel.frame.size.width, MAXFLOAT}; CGRect requiredSize = [self boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: yourLabel.font} context:nil]; 

Теперь рассчитать количество строк:

 int charSize = lroundf(yourLabel.font.lineHeight); int rHeight = lroundf(requiredSize.height); lineCount = rHeight/charSize; NSLog(@"No of lines: %i",lineCount); 

Второй вариант:

  NSInteger lineCount = 0; CGSize textSize = CGSizeMake(yourLabel.frame.size.width, MAXFLOAT); int rHeight = lroundf([yourLabel sizeThatFits:textSize].height); int charSize = lroundf(yourLabel.font.lineHeight); lineCount = rHeight/charSize; NSLog(@"No of lines: %i",lineCount); 

Swift 3 (IOS 10.3)

 extension UILabel { var numberOfVisibleLines: Int { let textSize = CGSize(width: CGFloat(self.frame.size.width), height: CGFloat(MAXFLOAT)) let rHeight: Int = lroundf(Float(self.sizeThatFits(textSize).height)) let charSize: Int = lroundf(Float(self.font.pointSize)) return rHeight / charSize } } 

Применение

 print(yourLabel.numberOfVisibleLines) 

Вот быстрая версия решения @Paresh:

 func lines(label: UILabel) -> Int { let textSize = CGSize(width: label.frame.size.width, height: CGFloat(Float.infinity)) let rHeight = lroundf(Float(label.sizeThatFits(textSize).height)) let charSize = lroundf(Float(label.font.lineHeight)) let lineCount = rHeight/charSize return lineCount } 

EDIT: я не знаю почему, но код возвращает еще 2 строки, чем фактическое количество строк, для моего решения я просто вычитал их перед возвратом lineCount.

Другие ответы здесь не numberOfLines свойство UILabel когда оно установлено на что-то отличное от 0.

Вот еще один вариант, который вы можете добавить в свою категорию или подкласс:

 - (NSUInteger)lineCount { CGSize size = [self sizeThatFits:CGSizeMake(self.frame.size.width, CGFLOAT_MAX)]; return MAX((int)(size.height / self.font.lineHeight), 0); } 

Некоторые примечания:

  • Я использую это на UILabel с приписанным текстом, даже не устанавливая свойство font , и он работает нормально. Очевидно, что у вас возникнут проблемы, если вы используете несколько шрифтов в вашем attributedText .
  • Если вы подклассифицируете UILabel для UILabel пользовательских UILabel (например, путем переопределения drawTextInRect: который является аккуратным трюком, который я нашел здесь ), тогда вы должны помнить о том, чтобы учитывать эти вставки при вычислении size выше. Например: CGSizeMake(self.frame.size.width - (self.insets.left + self.insets.right), CGFLOAT_MAX)

Вот код Swift3

 var lineCount: Int = 0 var textSize = CGSize(width: CGFloat(yourLabel.frame.size.width), height: CGFloat(MAXFLOAT)) var rHeight: Int = lroundf(yourLabel.sizeThatFits(textSize).height) var charSize: Int = lroundf(yourLabel.font.leading) lineCount = rHeight / charSize print("No of lines: \(lineCount)") 

Следуя за ответом @ Prince, я теперь UILabel категорию на UILabel следующим образом (обратите внимание, что я исправил некоторые незначительные ошибки синтаксиса в его ответе, которые не позволяли компилировать код):

UILabel + util.h

 #import <UIKit/UIKit.h> @interface UILabel (Util) - (NSInteger)lineCount; @end 

UILabel + Util.,

 #import "UILabel+Util.h" @implementation UILabel (Util) - (NSInteger)lineCount { // Calculate height text according to font NSInteger lineCount = 0; CGSize labelSize = (CGSize){self.frame.size.width, FLT_MAX}; CGRect requiredSize = [self.text boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: self.font} context:nil]; // Calculate number of lines int charSize = self.font.leading; int rHeight = requiredSize.size.height; lineCount = rHeight/charSize; return lineCount; } @end 

Вы можете найти общее количество линий, доступных на вашей пользовательской этикетке. Проверьте этот код …

 NSInteger numberOfLines = [self lineCountForText:@"YOUR TEXT"]; - (int)lineCountForText:(NSString *) text { UIFont *font = [UIFont systemFontOfSize: 15.0]; int width=Your_LabelWidht; CGRect rect = [text boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : font} context:nil]; return ceil(rect.size.height / font.lineHeight); } 
  • Действительно ли близкие строки с NSAttributedString?
  • End of NSAttributedString с emojis оставил неформатированным
  • if с пустой UILabel
  • Как вертикально корректировать текстовое положение titleView navigationBar при использовании пользовательского шрифта?
  • Использование нескольких цветов шрифта в одной ярлыке
  • Возможно ли сделать UILabel с неанглийскими символами зеленым, если включен цветной смешанный слой?
  • Swift не может присвоить значение типа '()', чтобы набрать 'String?'
  • Как визуализировать повернутую UIlabel
  • как получить все UILabels в UIView
  • UILabel с дополнением в Xamarin.iOS?
  • UILabel Text Strikethrough с цветом
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.