2010-02-15 4 views
6

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

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

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

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

ответ

6

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

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

+0

Спасибо Ули, хорошая идея. Работает как шарм. См. Код в другом комментарии. –

17
- (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 этот метод небезопасно запускать на потоках фона.

+0

Возможно, должен быть обновлен с помощью метода iOS - boundingRectWithSize: options: attributes: context :, из-за устаревания. – skyylex

+0

@skyylex действительно. Готово. –

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