2012-01-24 2 views
5

Im работает над ios-приложением, используя объектив c, и у меня есть проблема с uilabel, с которой я мог бы использовать некоторую помощь. В основном у меня есть ярлык, который может изменять размер, чтобы он соответствовал тексту, который он будет отображать, но он имеет максимальную высоту, что может быть. сам ярлык имеет фиксированную ширину во все времена. я включил UILineBreakModeWordWrap и UILineBreakModeTailTruncation, чтобы сделать текст подходящим и усеченным, но это приводит к тому, что текст обрезает хвост слишком рано, когда у него осталось только одно слово. вместо того, чтобы переместить его на следующую строку, когда еще есть место, оно просто усекает его.uilabel tail truncation

self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, fixedWidth, 0); 
self.lineBreakMode = UILineBreakModeWordWrap | UILineBreakModeTailTruncation; 
self.numberOfLines = 0; 
[self sizeToFit]; 

есть в любом случае найти, когда UILabel фактически усечение текста, так что я могу проверить высоту метки и добавить к нему, если есть еще место? Я всегда старался добавить лишнюю строку к высоте, когда есть место, и это позволяет избежать раннего усечения, но затем я оставил с несогласованным размером над всем ярлыком. любые идеи о том, что это будет большое спасибо

ответ

10

lineBreakMode - это переключатель. Это может быть либо (для iOS6 +) NSLineBreakByWordWrapping, либо NSLineBreakByTruncatingTail, но не оба.

Но, чтобы ответить на ваш вопрос, вы можете найти размер какого-либо текста, используя расширения класса в NSString+UIKit. Найдя размер, вы можете соответствующим образом обновить фрейм .

+0

закончил тем, что получил размер, который был бы указан по ссылке, которую вы предоставили (sizeWithFont :), а затем установите режим linebreakmode в wordwrap или tail trunc в зависимости от того, было ли это на максимуме или нет, а затем использовалось sizetofit и отлично сработало спасибо – glogic

+0

Nice tip по этой категории. Не знал, что это существовало раньше. – chakrit

0

Используя этот метод:

How to find UILabel's number of Lines

Вы можете установить метку на максимальной высоте, выяснить, насколько высокий текст в этой метке и уменьшить его по мере необходимости ,

1

Я написал категорию для работы с усечением UILabel. Работает на iOS 7 и более поздних версиях. Надеюсь, поможет !

@implementation UILabel (Truncation) 

- (NSRange)truncatedRange 
{ 
    NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:[self attributedText]]; 

    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; 
    [textStorage addLayoutManager:layoutManager]; 

    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:[self bounds].size]; 
    textContainer.lineFragmentPadding = 0; 
    [layoutManager addTextContainer:textContainer]; 

    NSRange truncatedrange = [layoutManager truncatedGlyphRangeInLineFragmentForGlyphAtIndex:0]; 
    return truncatedrange; 
} 

- (BOOL)isTruncated 
{ 
    return [self truncatedRange].location != NSNotFound; 
} 

- (NSString *)truncatedText 
{ 
    NSRange truncatedrange = [self truncatedRange]; 
    if (truncatedrange.location != NSNotFound) 
    { 
     return [self.text substringWithRange:truncatedrange]; 
    } 

    return nil; 
} 

@end 
+1

он не работает для нескольких строк –

0

Я только что пришел к аналогичной проблеме и решить ее с очень простым решением (проверено на КСНЕ 8.4, Xcode 7).

В IB (я использую autolayout с некоторыми ограничениями):

set UIlabel numberOfLine = 1; 
LineBrakeMode = TruncateTail 

В Код:

label.numberOfLines = 2; // I can only display 2 row. 
// I supposed you should know how many rows you can displayed. 

label.preferredMaxLayoutWidth = label.frame.size.width; 
[label sizeToFit]; 

Tadaa. Вот и все. Обратите внимание, что это работает только с UILabel. С UIButton он может не работать (не проверял).

+0

+1 для раскрытия атрибута "preferredMaxLayoutWidth". У меня есть другой случай из topicstarter, но этот атрибут решил мою проблему. –