Как усечь NSString на основе графической ширины? - PullRequest
6 голосов
/ 15 февраля 2010

В UILabel есть функция для усечения меток с использованием различных методов усечения (UILineBreakMode) В NSString UIKit Additions есть аналогичная функциональность для рисования строк.

Однако я не нашел способа получить доступ к самой усеченной строке. Есть ли другой способ получить усеченную строку на основе (графической) ширины для данного шрифта?

Я бы хотел иметь категорию на NSString с этим методом:

-(NSString*)stringByTruncatingStringWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

Ответы [ 2 ]

17 голосов
/ 16 февраля 2010
- (NSString*)stringByTruncatingStringWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode {
    NSMutableString *resultString = [[self mutableCopy] autorelease];
    NSRange range = {resultString.length-1, 1};

    while ([resultString boundingRectWithSize:CGSizeMake(FLT_MAX, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size.width > width) {
        // delete the last character
        [resultString deleteCharactersInRange:range];
        range.location--;
        // replace the last but one character with an ellipsis
        [resultString replaceCharactersInRange:range withString:truncateReplacementString];
    }
    return resultString;
}

Обратите внимание, что начиная с iOS 6, этот метод больше не безопасен для запуска в фоновых потоках.

6 голосов
/ 15 февраля 2010

Один из вариантов - пробовать разные размеры зацикливанием, пока не получите нужную ширину. То есть начните с полной строки, если она шире, чем нужно, замените последние два символа на многоточие. Цикл, пока он не станет достаточно узким.

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

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