代码之家  ›  专栏  ›  技术社区  ›  Ortwin Gentz

如何根据图形宽度截断NSString?

  •  6
  • Ortwin Gentz  · 技术社区  · 15 年前

    但是,我没有找到访问实际截断字符串的方法。有没有其他方法可以根据给定字体的(图形)宽度获取截断字符串?

    我希望使用此方法在NSString上创建一个类别:

    -(NSString*)stringByTruncatingStringWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode
    
    2 回复  |  直到 11 年前
        1
  •  6
  •   uliwitness    15 年前

    一种选择是通过循环尝试不同的尺寸,直到获得正确的宽度。也就是说,从完整字符串开始,如果该字符串比您需要的宽,则用省略号字符替换最后两个字符。循环直到足够窄。

    如果您认为您将使用长字符串,您可以向截断点进行二进制搜索,以使其更快一些。

        2
  •  17
  •   Ortwin Gentz    9 年前
    - (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,在后台线程上运行此方法不再安全。