【问题标题】:Objective-c Line breaks every 10 characters (Keeping words in tact)Objective-c 每 10 个字符换行一次(保持单词完整)
【发布时间】:2012-02-28 21:51:03
【问题描述】:

如果我有一个要加载到 TextField 中的字符串,我怎样才能使换行符 \n 每 10 个字符(包括空格和诸如此类)发生一次,但不能转到下一行中间字...比如用最多 10 个字符换行文本?但我不只是包装在 UITextField 中,我实际上需要输入 \n,因为它也将用于其他东西......(如果这很重要,这适用于 iOS)任何帮助,我真的被卡住了!

【问题讨论】:

    标签: objective-c ios word-wrap line-breaks charactercount


    【解决方案1】:

    您可能想在一个循环中使用 NSScanner 来组合这种东西,但要找出精确的算法,您需要明确说明您希望它如何工作。以下是您需要回答的问题:

    1. 是否应该将单词之间的多个空格序列“折叠”成一个空格以换行以换行,还是应该将 5 个连续空格的序列计为 5 个字符,而不是每行 10 个字符?我假设您希望折叠而不是保留多个空间
    2. 如果您有一个超过 10 个字符的单词,您希望它如何工作?您是否希望它以超过 10 个字符的行结束,或者您希望在这种情况下插入换行符并强制中间换行?我假设您希望允许超过 10 个字符的单词超出 10 个字符的限制。

    考虑到您的问题的这些假设,我会这样编码:

    NSMutableString *resultString = [[NSMutableString alloc] init];
    NSMutableString *currentLine = [[NSMutableString alloc] init];
    NSScanner *scanner = [NSScanner scannerWithString:sourceString];
    NSString *scannedString = nil;
    while ([scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString: &scannedString]) {
        if ([currentLine length] + [scannedString length] <= 10) {
            [currentLine appendFormat:@"%@ ", scannedString];
        }
        else if ([currentLine length] == 0) { // Newline but next word > 10
            [resultString appendFormat:@"%@\n", scannedString];
        }
        else { // Need to break line and start new one
            [resultString appendFormat:@"%@\n", currentLine];
            [currentLine setString:[NSString stringWithFormat:@"%@ ", scannedString]];
        }
        [scanner scanCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:NULL];
    }
    

    【讨论】:

    • 我希望我能为此给予双重支持。作为 IOS 世界的新手,我可能要花一整天的时间来写这篇文章,甚至更多。
    • 这不会返回字符串的最后一个或两个单词。
    【解决方案2】:

    我创建了一些实际中断的东西,不是每 10 个字符,而是在单词之间,不是没有断字引擎,这需要字典。我是根据 Perceptions 的答案构建的。

    NSMutableString * guid = [NSMutableString stringWithString: @"Some suitably long string will be used for demonstration purposes"];
    int lastSpace=0;
    int lastbreak=0;
    NSUInteger i = [guid length];
    while(i > 0) {
        if ([guid characterAtIndex:i-1]==' ')
            lastSpace=i;
        lastbreak++;
        if (lastbreak>9) {
            if (lastSpace!=0) {
                [guid insertString:@"\n" atIndex: lastSpace];
            } else {
                // we have not found a space in 10 chars, so break where there is no space.
                // no H&J engine here, so we can add the - or not.
                [guid insertString:@"-\n" atIndex: i];
                i++;  // since were adding a character, dont skip a character.
            }
            lastbreak=0;
            lastSpace=0;
        }
        i--;
    }
    

    【讨论】:

    • 非常容易上手! lastSpace 变量!为什么我没有想到这一点;)谢谢!
    • 等一下,对不起,这不像我想象的那样工作,它允许一行超过 10 个字符。我最多需要10个。它需要更频繁地换行
    • 经过一些调整,我让它工作了(从一开始就计算“i”变量,并在它超过 10 时强制在空格处中断,而不是在下一个单词之后)谢谢!
    • 啊!不,我用 11 / 得到了一些:也许它没有计算空格,但从你的代码的外观来看它确实如此!嗯
    • 如果您将 - 添加到该行,它必须计算在内,抱歉我没有代码。我会在那里添加一个 i++
    【解决方案3】:

    我会这样做:

    NSString *finalString = @"";
    NSString *yourString = @"This is your very very long string with many words and letters and spaces, haha";
    NSArray *someArray = [yourString componentsSeparatedByString:@" "]; //that will make an array with strings separated by spaces
    for (int i = 0; i < [someArray count]; i++) {
      NSArray *someArray2 = [finalString componentsSeparatedByString:@"\n"];
      if ([[someArray objectAtIndex:i]length] + [[someArray2 lastObject]length] > 9 )
        finalString = [NSString stringWithFormat:@"%@\n%@", finalString, [someArray objectAtIndex:i]];
      else
        finalString = [NSString stringWithFormat:@"%@ %@", finalString, [someArray objectAtIndex:i]];
    }
    

    我相信这样的事情应该会奏效。我附近没有Mac,所以我把它记下来了(这并不总是完美无缺的)。所以代码中可能会有一些错误。

    希望对你有帮助

    【讨论】:

    • 这很好,但没有大小写超过 10 个字符的单词
    【解决方案4】:

    您必须自己在字符串中插入换行符,这个 afaik 没有内置函数。

    NSMutableString * guid = [NSMutableString stringWithString: @"Some suitably long string will be used for demonstration purposes"];
    for(NSUInteger i = 10; i < [guid length] ; i += 10) {
        [guid insertString:@"\n" atIndex: i];
    }
    
    NSLog(@"GUID: %@", guid);
    

    【讨论】:

    • 这不会在单词之间添加中断。
    • 啊,错过了标题的那部分。
    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    相关资源
    最近更新 更多