2015-08-31 4 views
3

У меня есть UILabel с фиксированным размером, текст, который я установил в этом UILabel, может быть длиной 200, 5 или 500 символов. Что я хочу сделать, так это рассчитать, сколько видимого текста можно поместить в этот UILabel с текущим размером UILabel.Вычислить диапазон видимого текста в UILabel

Почему я хочу это сделать? Потому что я хочу добавить текст ...Read more в конце текста, но не в конец всего текста, только в конце видимого текста в UILabel.

Заранее спасибо.

+0

Check [RIOExpandableLabel] (https://github.com/chrrasmussen/RIOExpandableLabel). Метка с кнопкой «Больше», чтобы развернуть текст. –

ответ

2

Таким образом, я создал метод, который возвращает текущую видимую высоту строки (с размером UITextView/UITextField или UILabel), и это также поддержка iOS6 +, это то, что я сделал:

- (NSUInteger)fitString:(NSString *)string intoLabel:(UILabel *)label 
{ 
    UIFont *font   = label.font; 
    NSLineBreakMode mode = label.lineBreakMode; 

    CGFloat labelWidth  = label.frame.size.width; 
    CGFloat labelHeight = label.frame.size.height; 
    CGSize sizeConstraint = CGSizeMake(labelWidth, CGFLOAT_MAX); 

    if (SYSTEM_VERSION_GREATER_THAN(iOS_7)) 
    { 
     NSDictionary *attributes = @{ NSFontAttributeName : font }; 
     NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:string attributes:attributes]; 
     CGRect boundingRect = [attributedText boundingRectWithSize:sizeConstraint options:NSStringDrawingUsesLineFragmentOrigin context:nil]; 
     { 
      if (boundingRect.size.height > labelHeight) 
      { 
       NSUInteger index = 0; 
       NSUInteger prev; 
       NSCharacterSet *characterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; 

       do 
       { 
        prev = index; 
        if (mode == NSLineBreakByCharWrapping) 
         index++; 
        else 
         index = [string rangeOfCharacterFromSet:characterSet options:0 range:NSMakeRange(index + 1, [string length] - index - 1)].location; 
       } 

       while (index != NSNotFound && index < [string length] && [[string substringToIndex:index] boundingRectWithSize:sizeConstraint options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size.height <= labelHeight); 

       return prev; 
      } 
     } 
    } 
    else 
    { 
     if ([string sizeWithFont:font constrainedToSize:sizeConstraint lineBreakMode:mode].height > labelHeight) 
     { 
      NSUInteger index = 0; 
      NSUInteger prev; 
      NSCharacterSet *characterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; 

      do 
      { 
       prev = index; 
       if (mode == NSLineBreakByCharWrapping) 
        index++; 
       else 
        index = [string rangeOfCharacterFromSet:characterSet options:0 range:NSMakeRange(index + 1, [string length] - index - 1)].location; 
      } 

      while (index != NSNotFound && index < [string length] && [[string substringToIndex:index] sizeWithFont:font constrainedToSize:sizeConstraint lineBreakMode:mode].height <= labelHeight); 

      return prev; 
     } 
    } 

    return [string length]; 
} 

Из Конечно, SYSTEM_VERSION_GREATER_THAN (iOS_7) - оба макроса, которые я определил. Вы также должны определить свои собственные.

Удачи!

+0

Мне нужна помощь с этим кодом ... Могу ли я помочь мне –

0

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

Set Your Text Like this

Добавить текст в строку, как: -> lbl.text = @ "abcdeedjedaekd ..... Читать больше."

Сво идея не правильное решение, но может быть полезным для вас

+0

Добавьте текст в строку как: -> lbl.text = @ "abcdeedjedaekd ..... Подробнее." – Mehul

+0

его работая во мне – Mehul

+0

его Идея не правильное решение, но может быть полезно для вас – Mehul

0

Вы можете установить фиксированное количество символов, за которым следует:

CGSize size = [string sizeWithFont:font 
       constrainedToSize:sizeConstraint 
        lineBreakMode:UILineBreakModeWordWrap]; 

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

0

Это один работает для меня, надеюсь, что это поможет вам тоже

- (NSUInteger)fitString:(NSString *)string intoLabel:(UILabel *)label 
{ 
    UIFont *font   = label.font; 
    NSLineBreakMode mode = label.lineBreakMode; 

    CGFloat labelWidth  = label.frame.size.width; 
    CGFloat labelHeight = label.frame.size.height; 
    CGSize sizeConstraint = CGSizeMake(labelWidth, CGFLOAT_MAX); 


    NSDictionary *attributes = @{ NSFontAttributeName : font }; 
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:string attributes:attributes]; 
    CGRect boundingRect = [attributedText boundingRectWithSize:sizeConstraint options:NSStringDrawingUsesLineFragmentOrigin context:nil]; 
    { 
     if (boundingRect.size.height > labelHeight) 
     { 
      NSUInteger index = 0; 
      NSUInteger prev; 
      NSCharacterSet *characterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; 

      do 
      { 
       prev = index; 
       if (mode == NSLineBreakByCharWrapping) 
        index++; 
       else 
        index = [string rangeOfCharacterFromSet:characterSet options:0 range:NSMakeRange(index + 1, [string length] - index - 1)].location; 
      } 

      while (index != NSNotFound && index < [string length] && [[string substringToIndex:index] boundingRectWithSize:sizeConstraint options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size.height <= labelHeight); 

      return prev; 
     } 
    } 


    return [string length]; 
}