Как усечь строку в Objective-C, а затем добавить эллипсис в конец?
Усечение строки и добавление эллипсиса в конце в Objective-c
Ответ 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];