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

Я отобразил текст в UILabel с помощью метода обхода. Теперь мне нужно найти количество строк в UILabel.

Если есть возможный способ найти количество строк в строке UILabel.

Благодарю.

Как указывалось, этот пост описывает, как получить высоту, а не количество строк. Чтобы получить количество строк,

  1. Получите высоту для одной буквы, например @"A" .
  2. Разделите высоту строки на высоту, полученную в 1 выше.

Например

 CGFloat unitHeight = [@"A" heightForWidth:width usingFont:font]; CGFloat blockHeight = [text heightForWidth:width usingFont:font]; NSInteger numberOfLines = ceilf(blockHeight / unitHeight); // need to #include  for ^^^^^ 

Начиная с iOS 7, способ получения желаемой высоты метки изменился. Чтобы получить высоту, вы можете использовать следующий код:

 NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init]; CGSize labelSize = (CGSize){width, FLT_MAX}; CGRect r = [self boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:context]; 

где высота равна r.size.height . Обратите внимание, что font должен быть предоставлен. Вы можете поместить это в категорию для NSString для удобства, например

 @implementation NSString (HeightCalc) - (CGFloat)heightForWidth:(CGFloat)width usingFont:(UIFont *)font { NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init]; CGSize labelSize = (CGSize){width, FLT_MAX}; CGRect r = [self boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:context]; return r.size.height; } @end 

(Делайте управление памятью, если не используете ARC, кстати.)

Для iOS 6 и ниже:

Предположим, у вас есть UILabel *myLabel и вы хотите узнать высоту метки (с некоторой настройкой вы можете получить # строк, разделив высоту с некоторым соответствующим числом, которое зависит от размера шрифта).

 UILabel *myLabel; CGSize labelSize = [myLabel.text sizeWithFont:myLabel.font constrainedToSize:myLabel.frame.size lineBreakMode:UILineBreakModeWordWrap]; CGFloat labelHeight = labelSize.height; 

Надеюсь, это поможет. Если это не поможет, дайте мне знать, и я буду копать дальше. Кроме того, непроверенный код, но работал со ссылкой.

Для более полного примера, вот код, который я ввел в метод viewDidLoad: для controllerа вида:

 [super viewDidLoad]; UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(50,50,200,350)]; myLabel.numberOfLines = 0; myLabel.lineBreakMode = UILineBreakModeWordWrap; myLabel.text = @"This is some text in a UILabel which is long enough to wrap around the lines in said UILabel. This is a test, this is only a test."; [self.view addSubview:myLabel]; CGSize labelSize = [myLabel.text sizeWithFont:myLabel.font constrainedToSize:myLabel.frame.size lineBreakMode:UILineBreakModeWordWrap]; CGFloat labelHeight = labelSize.height; NSLog(@"labelHeight = %f", labelHeight); [myLabel release]; 

Выход из NSLog идет:

 2010-11-15 18:25:27.817 so_labelheight[728:307] labelHeight = 126.000000 

Для iOS7 и выше официально санкционированный способ подсчета количества строк – использовать TextKit:

 func numberOfLinesForString(string: String, size: CGSize, font: UIFont) -> Int { let textStorage = NSTextStorage(string: string, attributes: [NSFontAttributeName: font]) let textContainer = NSTextContainer(size: size) textContainer.lineBreakMode = .ByWordWrapping textContainer.maximumNumberOfLines = 0 textContainer.lineFragmentPadding = 0 let layoutManager = NSLayoutManager() layoutManager.textStorage = textStorage layoutManager.addTextContainer(textContainer) var numberOfLines = 0 var index = 0 var lineRange : NSRange = NSMakeRange(0, 0) for (; index < layoutManager.numberOfGlyphs; numberOfLines++) { layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange) index = NSMaxRange(lineRange) } return numberOfLines } 

Метод -sizeWithFont:constrainedToSize:lineBreakMode теперь устарел. Вы захотите использовать метод -boundingRectWithSize:options:attributes:context: now.

Вот примеры:

 CGSize boundingRectSize = CGSizeMake(widthToConstrainTo, CGFLOAT_MAX); NSDictionary *attributes = @{NSFontAttributeName : [UIFont fontWithName:fontName size:14]}; CGRect labelSize = [labelString boundingRectWithSize:boundingRectSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil]; 

В приведенном выше примере я знаю ширину, которую я хочу ограничить меткой, но поскольку я не уверен в высоте, я просто макс с параметром высоты с использованием CGFLOAT_MAX . Для options вам нужно использовать NSStringDrawingUsesLineFragmentOrigin и NSStringDrawingUsesFontLeading если вы пытаетесь вычислить размер метки, которая может быть любым количеством строк.

sizeWithFont устарел в iOS 7, вы можете использовать это вместо:

 - (int)lineCountForText:(NSString *) text { UIFont *font = ... CGRect rect = [text boundingRectWithSize:CGSizeMake(200, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : font} context:nil]; return ceil(rect.size.height / font.lineHeight); } 

Если вы ищете этот ответ в Swift 2 + / iOS 8, он будет выглядеть так:

 func numberOfLinesInLabel(yourString: String, labelWidth: CGFloat, labelHeight: CGFloat, font: UIFont) -> Int { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.minimumLineHeight = labelHeight paragraphStyle.maximumLineHeight = labelHeight paragraphStyle.lineBreakMode = .ByWordWrapping let attributes: [String: AnyObject] = [NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle] let constrain = CGSizeMake(labelWidth, CGFloat(Float.infinity)) let size = yourString.sizeWithAttributes(attributes) let stringWidth = size.width let numberOfLines = ceil(Double(stringWidth/constrain.width)) return Int(numberOfLines) } 

(Я изначально разместил свой ответ здесь, но не имею достаточной репутации, чтобы комментировать или отмечать дубликаты.)

Другие ответы, которые я нашел, не уважают свойство UILabel когда оно установлено на что-то отличное от 0.

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

 - (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 .
  • Если вы подclassифицируете UILabel для UILabel пользовательских UILabel (например, путем переопределения drawTextInRect: который является аккуратным трюком, который я нашел здесь ), тогда вы должны помнить о том, чтобы учитывать эти вставки при вычислении size выше. Например: CGSizeMake(self.frame.size.width - (self.insets.left + self.insets.right), CGFLOAT_MAX)
 func getHeight(text: NSString, width:CGFloat, font: UIFont) -> CGFloat { let rect = text.boundingRect(with: CGSize.init(width: width, height: CGFloat.greatestFiniteMagnitude), options: ([NSStringDrawingOptions.usesLineFragmentOrigin,NSStringDrawingOptions.usesFontLeading]), attributes: [NSFontAttributeName:font], context: nil) return rect.size.height } 

text: метка, высота которой вам нужно найти с заданной строкой

width: ширина UILabel

шрифт: шрифт UILabel

  • Каков наилучший способ связи между controllerами?
  • Способ постоянно активировать UIButton во время ситуации с нажатием и удержанием?
  • Рекомендации по миграции базы данных в приложении для Sqlite
  • core data в статической библиотеке для iPhone
  • Как я могу протестировать Apple Push Notification Service без iPhone?
  • Звук перекрывается несколькими нажатиями кнопок
  • Продолжительность анимации строки UITableView и обратный вызов завершения
  • Как я смогу удалить объекты из NSMutableArray?
  • Как сделать операцию modulo в объективе-c / cocoa touch?
  • Каковы некоторые хорошие обучающие игры для iPhone 3D / 2D OpenGL ES?
  • Google + iPhone API входит и делится без оставления приложения.
  • Давайте будем гением компьютера.