我有一个很长的 NSString , UIFont 和所需的宽度。我想在给定的UIFont中只获得符合宽度的两个第一行字符串。通过“获取”我的意思是获得一个子串。第二行可能会被截断,并且必须考虑到第一行的自动换行。
我怎样才能做到这一点?请告诉我正确的方向。谢谢!
答案 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);
对不起,我很抱歉。我已经写好了这个表格。