обрезание хвоста - PullRequest
       6

обрезание хвоста

5 голосов
/ 24 января 2012

Я работаю над приложением ios, используя цель c, и у меня есть проблема с uilabel, с которой я мог бы помочь.По сути, у меня есть метка, которая может изменить размер, чтобы соответствовать тексту, который он будет отображать, но у него максимальная высота, на которую это возможно.Сам ярлык всегда имеет фиксированную ширину.я включил UILineBreakModeWordWrap и UILineBreakModeTailTruncation, чтобы сделать текст подходящим и усеченным, но это заставляет текст обрезать хвост слишком рано, когда у него осталось только 1 слово.вместо того, чтобы перемещать его на следующую строку, когда еще есть место, он просто обрезает его.

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

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

Ответы [ 4 ]

11 голосов
/ 24 января 2012

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

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

0 голосов
/ 28 сентября 2015

Я только что пришел к аналогичной проблеме и решил ее очень простым решением (протестировано на ios 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];

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

0 голосов
/ 13 июня 2015

Я написал категорию для работы с усечением 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
0 голосов
/ 24 января 2012

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

Как узнать количество строк UILabel

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...