截断一个字符串并在Objective-c的末尾添加省略号

Suc*_*chi 12 iphone objective-c ios

如何截断Objective-C中的字符串,然后在末尾添加省略号?

Ric*_*ter 25

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


Pen*_*One 11

使用这些NSString方法之一截断,可能是最后一个:

– substringFromIndex:
– substringWithRange:
– substringToIndex:
Run Code Online (Sandbox Code Playgroud)

然后使用该NSString方法

– stringByAppendingString:
Run Code Online (Sandbox Code Playgroud)

添加@"..."或任何你喜欢的ellopsis.

例如:

NSString *newString = [[string substringToIndex:12] stringByAppendingString:@"..."];
Run Code Online (Sandbox Code Playgroud)

为了您的阅读乐趣,我推荐NSString课堂参考.

  • 该解决方案的问题在于它**总是*附加省略号,只有当它执行截断时才应该. (2认同)

Ton*_*thy 9

如果您希望截断并将省略号添加到最大为特定宽度的字符串,这里是一个考虑字体和大小的实现:

+ (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;
}
Run Code Online (Sandbox Code Playgroud)


dam*_*thH 6

这样做不需要代码...这是最简单的方法,

对于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]];
}
Run Code Online (Sandbox Code Playgroud)

听到我dirtyRect用于String的绘图区域,您可以根据需要进行更改.

对于NSTextField

NSTextField *_warningTF = [[NSTextField alloc]init];
[_warningTF setStringValue:@"sfdsf sdfdsfdsfdsfdsfdsfdsf  1234566789123456789sfdsf dsf dsfdsf"];
[_warningTF.cell setLineBreakMode:NSLineBreakByTruncatingTail];
Run Code Online (Sandbox Code Playgroud)


Mik*_*nov 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
Run Code Online (Sandbox Code Playgroud)

用法:

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

结果:

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

希望它对某人有帮助.