Подтвердить что ты не робот

Усечение строки и добавление эллипсиса в конце в Objective-c

Как усечь строку в Objective-C, а затем добавить эллипсис в конец?

4b9b3361

Ответ 1

NSString *origString = @"A very long string blah blah blah";
const int clipLength = 18;
if([origString length]>clipLength)
{
    origString = [NSString stringWithFormat:@"%@...",[origString substringToIndex:clipLength]];
}

Ответ 2

Используйте один из этих методов NSString для усечения, возможно, последний:

– substringFromIndex:
– substringWithRange:
– substringToIndex:

а затем используйте метод NSString

– stringByAppendingString:

добавить @"..." или любой желаемый эллипс.

Например:

NSString *newString = [[string substringToIndex:12] stringByAppendingString:@"..."];

Для удовольствия от чтения я рекомендую NSString Ссылка на класс.

Ответ 3

Если вы хотите усечь и добавить многоточие в строку с максимальным значением определенной ширины, вот реализация, которая учитывает шрифт и размер:

+ (NSString *)stringByTruncatingString: (NSString *)string toWidth: (CGFloat)width withFont: (UIFont *)font
{
    #define ellipsis @"..."
    NSMutableString *truncatedString = [string mutableCopy];

    if ([string sizeWithAttributes: @{NSFontAttributeName: font}].width > width) {
        width -= [ellipsis sizeWithAttributes: @{NSFontAttributeName: font}].width;

        NSRange range = {truncatedString.length - 1, 1};

        while ([truncatedString sizeWithAttributes: @{NSFontAttributeName: font}].width > width) {
            [truncatedString deleteCharactersInRange:range];
            range.location--;
        }

        [truncatedString replaceCharactersInRange:range withString:ellipsis];
    }

    return truncatedString;
}

Ответ 4

Не нужен патрон кода для этого. самый простой способ сделать это,

для drawRect

- (void)drawRect:(NSRect)dirtyRect{
    NSString *theText = @"bla blah bla bhla bla bla";
    NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    [style setLineBreakMode:NSLineBreakByTruncatingTail];
    [theText drawInRect:dirtyRect withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:style, NSParagraphStyleAttributeName,nil]];
}

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

для NSTextField

NSTextField *_warningTF = [[NSTextField alloc]init];
[_warningTF setStringValue:@"sfdsf sdfdsfdsfdsfdsfdsfdsf  1234566789123456789sfdsf dsf dsfdsf"];
[_warningTF.cell setLineBreakMode:NSLineBreakByTruncatingTail];

Ответ 5

Я написал простую категорию для обрезания NSString словами:

@interface NSString (TFDString)

- (NSString *)truncateByWordWithLimit:(NSInteger)limit;


@end


@implementation NSString (TFDString)

- (NSString *)truncateByWordWithLimit:(NSInteger)limit {
    NSRange r = NSMakeRange(0, self.length);
    while (r.length > limit) {
        NSRange r0 = [self rangeOfString:@" " options:NSBackwardsSearch range:r];
        if (!r0.length) break;
        r = NSMakeRange(0, r0.location);
    }
    if (r.length == self.length) return self;
    return [[self substringWithRange:r] stringByAppendingString:@"..."];
}


@end

Применение:

NSString *xx = @"This string is too long, somebody just need to take and truncate it, but by word, please.";
xx = [xx truncateByWordWithLimit:50];

Результат:

This string is too long, somebody just need to...

Надеюсь, это поможет кому-то.

Ответ 6

drawWithRect: options: attributes: помогает метод context. вы можете попробовать следующее:

[_ text drawWithRect: _textRect: NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine: атрибут context: nil];