0

かなり長い文字列のコンテンツをコンテンツのページに分割しようとしています。現在、次のように文字単位 (1 ページあたり 500 文字) でこれを行っています。

//Lets find out how many pages to make
    int pageLength = 500; //how many characters per page
    NSString *text = ((Story *) [self.story objectAtIndex:chapter]).content;
    int NumberOfPages = (text.length/pageLength);
    //NumberOfPages += 1;

    //Build the Pages Array
    NSMutableArray *pageStrings = [[NSMutableArray alloc] init];
    for (int i = 0; i <= (NumberOfPages+1); i++)
    {
        if (i < NumberOfPages) {
            //Load the text like normal
            NSString *contentString = [[NSString alloc]initWithFormat:@"<html><head><style type=text/css>body {font-family: \"%@\"; font-size: %d;}</style></head><body><p>%@</p></body></htlm>",@"helvetica",20,[text substringWithRange:NSMakeRange(i*pageLength,pageLength)]];
            [pageStrings addObject:contentString];
        }
        if (i == NumberOfPages) {
            //on the last page, only load what's available
            NSString *contentString = [[NSString alloc]initWithFormat:@"<html><head><style type=text/css>body {font-family: \"%@\"; font-size: %d;}</style></head><body><p>%@</p></body></htlm>",@"helvetica",20,[text substringWithRange:NSMakeRange(i*pageLength,(text.length-(i*pageLength)))]];
            [pageStrings addObject:contentString];
        }
        if (i > NumberOfPages){
            //add in a blank page on the end
            NSString *contentString = [[NSString alloc]initWithFormat:@"<html><head><style type=text/css>body {font-family: \"%@\"; font-size: %d;}</style></head><body><p>%@</p></body></htlm>",@"helvetica",20,@"What do you do?"];
            [pageStrings addObject:contentString];
        }
    }
    pageContent = [[NSArray alloc] initWithArray:pageStrings];

これはうまく機能しますが、途中で単語が分割されてしまうことがよくあります。代わりに単語を分割しようとしています。文字列は正確に 500 文字である必要はありません。

4

2 に答える 2

3

それを「正しく」実行したい場合は、NSStringメソッドを確認する必要があります。

- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block

単語、行、段落、文、および文字シーケンスによってテキストをインテリジェントに列挙できます。

セッション128、WWDC 2011、「高度なテキスト処理」には、これに関するいくつかの良い情報があります。

于 2012-08-21T01:00:24.747 に答える
0

できることは、最後のスペースまたは改行がどこにあったかを追跡することです。このようにして、スペースがなくなって単語の途中にいるときに、単語を途切れさせずに終了できる最後の場所を知っています。次に、この場所から制限の 500 まで毎回続行します。これには、500 文字の各セットを反復処理することが含まれます。

于 2012-08-21T00:07:14.050 に答える