3

TextField にロードする文字列がある場合、改行 \n を 10 文字 (スペースなどを含む) ごとに発生させますが、単語の途中で次の行に移動しないようにするにはどうすればよいですか... テキストをラップするように最大10文字で?しかし、私は UITextField でラップしているだけではありません。実際には \n を入力する必要があります。これは、他の何かでも使用されるためです... (これは iOS 用です)

4

4 に答える 4

5

NSScanner をループで使用してこの種のものをまとめたいと思うかもしれませんが、正確なアルゴリズムを理解するには、それをどのように機能させたいかを正確に明確にする必要があります。回答する必要がある質問は次のとおりです。

  1. テキストをラップする目的で、単語間の複数の空白のシーケンスを単一の空白に「折りたたむ」必要がありますか、それとも 5 つの連続した空白のシーケンスは、1 行あたり 10 文字に対して 5 文字としてカウントする必要がありますか? 複数のスペースを保持するのではなく、折りたたむ必要があると想定します
  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];
}
于 2012-02-28T23:05:00.527 に答える
2

10文字ごとではなく、実際にブレークを実行するものを作成しましたが、単語の間にハイフンエンジンがないため、辞書が必要になります。私は知覚の答えからそれを構築しました。

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--;
}
于 2012-02-28T22:44:16.940 に答える
1

私はそのような方法でそれをします:

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を持っていないので、それを私の記憶に書き留めました(これは常に完璧であるとは限りません)。そのため、コードにいくつかのエラーがある可能性があります。

それが役に立てば幸い

于 2012-02-28T22:43:27.733 に答える
0

自分で改行文字を文字列に挿入する必要があります。このための組み込み関数はありません。

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);
于 2012-02-28T22:26:56.177 に答える