如何在x行修剪NSString?

时间:2014-01-26 14:36:57

标签: ios iphone objective-c nsstring trim

这应该是一个简单的问题。我正在尝试将NSString修剪为最大高度为150px的文本,然后将“继续阅读”添加到该修剪文本的末尾。所以说我们有以下内容。

a
b
c
d
e
f
g
h
i
j
k
l
m

我们有一个字体,13 ...我们计算总文本高度,并看到它在13px字体时超过150px高。我的问题是,如何切割超过150px的字符串部分?

3 个答案:

答案 0 :(得分:0)

你可以使用

- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(NSLineBreakMode)lineBreakMode

(在iOS7上更好地使用boundingRectWithSize:options:attributes:context:

继续在字符串while (size.height<150.0f)中添加一行。

编辑:这个例子可以工作:(注意:如果你不使用ARC,应该自动释放trimmedStr!)

- (NSString*) stringByTrimmingString:(NSString*)str forSize:(CGSize)maxSize withFont:(UIFont*)font
{
    NSMutableString* trimmedStr = [NSMutableString new];
    for (NSString* line in [str componentsSeparatedByString:@"\n"]) {

        NSString *testStr = [trimmedStr stringByAppendingFormat:@"%@\n",line];

        CGSize sz = [testStr sizeWithFont:font forWidth:maxSize.width lineBreakMode:NSLineBreakByWordWrapping];
        if (sz.height > maxSize.height) {
                return [trimmedStr copy];
        }
        [trimmedStr appendFormat:@"%@\n",line];
    }
    return [trimmedStr copy];
}

答案 1 :(得分:0)

我做了一些非常愚蠢(蛮力)的事情,以便在我的应用中完成这项工作。我在UILabel中手动创建新的行字符和缩进。为此,我找到了文本中的第一个空格(以获得第一个单词的结尾),检查是否超出了我的范围。如果没有,我移动到第二个空格并检查。

要为你做一些更聪明的事情,我会将你的字符串分成两半然后看看那一半是否超出你的界限。如果是,那么转到1/4,如果不是那么转到3/4并检查。然后,一旦找到使你超出限制的角色,然后向后搜索一个空格(找到适合的最后一个单词)并在那里截断你的字符串。这可能看起来像是困难的代码,但它就像二元搜索algorythm,但通过你的字符串。

答案 2 :(得分:0)

您只需使用

即可
-(CGSize)sizeWithFont:(UIFont*)font forWidth:(CGFloat)width lineBreakMode:(NSLineBreakMode)lineBreakMode;

因为它会考虑所有\ n字符并计算正确的CGSize。