繁体   English   中英

如何在第x行修剪NSString?

[英]How do I trim an NSString at line x?

这应该是一个简单的问题。 我试图将NSString修剪为最大高度不超过150px的任何文本,然后将“ Continue Reading”附加到该修剪的文本的末尾。

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

我们有一个说13的字体...我们计算了总的文本高度,发现13px字体的高度超过150px。 我的问题是,如何切割超过150px的字符串部分?

你可以用

- (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];
}

我做了一些相当愚蠢的事情(蛮力),以在我的应用程序中完成此任务。 我在UILabel中手动创建换行符和缩进。 为此,我在文本中找到第一个空格(以获取第一个单词的结尾),检查是否超出了我的范围。 如果没有,我将移至第二个空间并进行检查。

为了给您做些更聪明的事情,我将您的字符串分成两半,然后看看这一半是否超出了您的范围。 如果是,则转到1/4,否则转到3/4并进行检查。 然后,一旦找到使您超出限制的字符,然后向后搜索空格(以找到适合的最后一个单词)并在其中截断字符串。 这看起来像是困难的代码,但就像二进制搜索算法一样,但是通过您的字符串。

您可以简单地使用

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM