2010-11-13 4 views
39

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

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

Спасибо.

+0

http://stackoverflow.com/questions/4082041/resulting-lines-of-uilabel-with-uilinebreakmodewordwrap/14401282#14401282 – TheTiger

ответ

50

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

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

E.g.

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

С прошивкой 7 пути получения желаемого ВЫСОТА лейбла изменилось. Для того, чтобы получить высоту, вы можете использовать следующий код:

где высота 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 

(Do управление памятью, если не используется 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: метод контроллера Вид:

[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 
+0

он показывает следующие две ошибки // ошибка: несовместимый тип для аргумента 2 из 'sizeWithFont: constrainedToSize : lineBreakMode:» \t \t \t ошибка: запрос члена„размера“в чем-то не структуры или объединения – Velmurugan

+0

Ofcourse .size не является свойством на UILabel, но это, вероятно, следует что-то вроде myLabel.frame.size или MyLabel .bounds.size (не уверен, какой из них вы хотите). –

+0

Ах да, пропустил этот. Спасибо Wim H. Исправил пример выше, чтобы использовать frame.size. – Kalle

7

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

Вот примеры:

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, если вы пытаетесь рассчитать размер метки, которая может быть любым количеством строк.

6

sizeWithFont осуждается в прошивке 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); 
} 
13

Для iOS7 и выше, officially sanctioned way подсчитать количество строк, чтобы использовать 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 
} 
2

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

Другие ответы I'v е найдено не уважают 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 иметь пользовательские края врезки (например, перекрывая drawTextInRect:, что аккуратный трюк я нашел here), то вы должны помнить, чтобы принять эти врезки во внимание при расчете size выше. Например: CGSizeMake(self.frame.size.width - (self.insets.left + self.insets.right), CGFLOAT_MAX)
5

Если вы ищете этот ответ в 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) 
} 
+0

Этот ответ хорош от iOS8 –

+0

Спасибо @AvielGross. Отредактировано с учетом вашего ввода. – cph2117

+0

Какова цель «сдерживать» здесь? –

0
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 
} 

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

ширина: ширина UILabel

шрифта: шрифт UILabel в

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