给出宽度和字体的前两行NSString

时间:2011-12-12 11:10:44

标签: iphone objective-c ios ipad nsstring

我有一个很长的 NSString UIFont 和所需的宽度。我想在给定的UIFont中只获得符合宽度的两个第一行字符串。通过“获取”我的意思是获得一个子串。第二行可能会被截断,并且必须考虑到第一行的自动换行。

我怎样才能做到这一点?请告诉我正确的方向。谢谢!

5 个答案:

答案 0 :(得分:2)

我认为没有简单,干净优雅的方式来做到这一点。但是如果你看一下NSString UIKit Additions reference,有些方法可能会有助于得到一个很好的近似值。

特别要看:

 CGSize aSize = 
 [ myString  sizeWithFont:(UIFont *)aFont 
        constrainedToSize:(CGSize ) aSize ];

使用所需宽度的aSize和所需高度的2 * fontSize(2行)。 获取生成的宽度(aSize.width)并除以字体大小。如果它适合放在这个框中,这应该接近你的字符串被截断的位置。

现在不幸的是,你需要字体比率(点大小与宽度比),我不知道如何获得。我已经确定它在4到6之间,但这就像说pi约为3。

无论如何,字符串被截断的近似索引将是

 ( fontRatio * aSize.width ) / fontSize;

我写了一个小模拟器项目来测试线宽,字体比,字体大小等各种组合,欢迎您使用。就在这里:string test project

答案 1 :(得分:1)

这个怎么样?

- (NSString*) stringWithString:(NSString*)longString width:(float)width font:(UIFont*)font {

    if([longString sizeWithFont:font].width < width) {
        return longString;
    }

    NSMutableString* mutString = [NSMutableString stringWithFormat:@""];
    int i = 0;
    while ([mutString sizeWithFont:font].width < width && i < [longString length]) {
        unichar ch = [longString characterAtIndex:i];
        [mutString appendString:[NSString stringWithCharacters:&ch length:1]];
        i++;
    }

    NSString* shortenedString = [mutString substringToIndex:[mutString length] - 1];

    return shortenedString;
}

基本上我逐个添加字符,每次都检查是否达到了所需的宽度。

编辑:

使用自动换行和两行,您可以调整上面的代码并使用以下内容检查大小:

[mutString sizeWithFont:font constrainedToSize:CGSizeMake(9999999, font.lineHeight*2) lineBreakMode:UILineBreakModeWordWrap]

您也可以使用单词来代替单个字符:

[longString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]

这将返回一个数组,其中包含字符串中可用于循环的所有单词。

答案 2 :(得分:0)

您可以尝试将前两行文本放在必要宽度的UILabel中。您可以设置此标签的字体。 然后你可以有另一个标签,用另一种字体保存文本的剩余部分。 希望这会有所帮助。

答案 3 :(得分:0)

通过“获取”你的意思是画出它,在前两行之后截断?或者检索一个字符串,该字符串表示适合前两行空间的内容?

对于前者,您只需绘制它,UILabel就会为您截断。

对于后者,我认为你必须要打破自己这个词并测量子串以找出合适的东西。

答案 4 :(得分:0)

const int kPadding = 4; // Padding for the diference between the font's height and the line height - it's 2 for front and 2 for bottom

float maxHeight = (FONT_SIZE+kPadding)*kNumberOfLinesYouNeed;
CGSize labelSize = [yourString sizeWithFont:yourFont constrainedToSize:CGSizeMake(kYourNeededWidth, maxHeight) lineBreakMode:UILineBreakModeWordWrap];
youLabel.frame=CGRectMake(yourX, yourY, kYourNeededWidth, maxHeight);

对不起,我很抱歉。我已经写好了这个表格。