お?いけるくさい?

iPhoneアプリエンジニアのたまごです。いっちょまえエンジニア目指してちいさな発見や学んだことを覚え書きしていきます!Objective-C/iOS/開発

原文(NSString)から改行とスペースを除いてラベル表示

▼やりたいこと

【改行と空文字が入っている文字列から

  改行とスペースを除き、2行分まで表示して残りを省略】

 

▼つまりこういうこと

[原文]

///////////////////////////////////////////////////////////////////////////

はじめまして。

プロフィールを読んで頂きありがとうございます!

 

□□に住んで□□年になります。

出身は□□です。

仕事は□□をしています。

趣味は□□や□□です。

 

最近の休日はカフェで本を読んだり、ショッピングに出かけることが多いです。

///////////////////////////////////////////////////////////////////////////

[表示]

///////////////////////////////////////////////////////////////////////////

はじめまして。プロフィールを読んで頂きありがとうございま

す!□□に住んで□□年になります。出身は□□です。仕事...

 ///////////////////////////////////////////////////////////////////////////

 

▼STEP①

一発で出来たら便利だなーと思いながらとりあえずぐぐる

出た!

http://obc-fight.blogspot.jp/2012/07/nsstring-trim-spaces.html

これでいけるんじゃ?(´゜∀゜`)とかテンション高めに使ってみたが

何も起こらない。w

 

▼STEP②

と思ったら、同じようにハマっている方がいた。

http://blog.nodoa.info/?p=80

なるほどー。「文字列の両端から」ってのは多分英文とかそゆことなのかな?

よし、じゃあこれで@"\n"を@""に置換しちゃえー(´゜∀゜`)

とかテンション高めに使ってみたが

何も起こらない。w

とりあえずここで全角スペースだけは空文字に置換するようにしてと。

 

▼STEP③

気を取り直してようやく発見!

http://qiita.com/Ushio@github/items/828d0c806b72c4b71d8d

これを使うと下記のように一行ごとに配列に格納される。

 

("はじめまして。",

"プロフィールを読んで頂きありがとうございます!",

"",

"□□に住んで□□年になります。", ...);

 

あとはNSMutableStringをいっこ用意して、

for文で配列の要素分回して

空文字(空の行)じゃなかったらどんどんappendして繋げてあげればひとまず

///////////////////////////////////////////////////////////////////////////

はじめまして。プロフィールを読んで頂きありがとうございます!□□に住んで□□年になります。出身は□□です。仕事は□□をしています。趣味は□□や□□です。最近の休日はカフェで本を読んだり、ショッピングに出かけることが多いです。

///////////////////////////////////////////////////////////////////////////

 という文章が完成。おしゃ!\(^ω^\)( /^ω^)/

 

▼ラベルを用意

ここまで来たらあとはLabel側で調整。

numberOfLinesを2に設定して、sizeToFitをかけるのと、

尻すぼみにするのはこちらを参考にして実装。

http://pirosikick.hateblo.jp/entry/20100816/1281972881

 

▼完成版コード

ちょっと複雑なことしてるのは

テーブルビューのセルを可変にするためにやってるだけです。

廃止になったメソッドのケアもして、iOS7とiOS6でラベルの作り方わけてます。

 

+ (UILabel *)createLabel:(NSString *)originalText

{

if ([originalText isEqualToString:@""]) {

        //空文字なら処理しない

        return nil;

    }

 

NSLog(@"original:%@",originalText);

    originalText = [originalText stringByReplacingOccurrencesOfString:@" "withString:@""];//全角除去

    NSMutableArray *lines = [NSMutableArrayarray];

    [originalText enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) {

        [lines addObject:line];

    }];

    NSMutableString *text = [[NSMutableStringalloc] init];

    for (int i = 0; i < [lines count]; i++) {

        if (![lines[i] isEqualToString:@""]) {

            [text appendString:lines[i]];

        }

    }

    NSLog(@"text:%@",text);

    

    UILabel *label;

    UIFont *font = [UIFont systemFontOfSize:13.0];

    if (OS_VERSION_LESS_THAN(@"7.0")) {

        //iOS6

        NSLog(@"OS6:%s",__func__);

        CGSize size = [(text ? text : @"") sizeWithFont:font

                                      constrainedToSize:(CGSize){MSG_MAX_WIDTH, MSG_MAX_HEIGHT}

                                          lineBreakMode:NSLineBreakByTruncatingTail];

        label = [[UILabel alloc] initWithFrame:(CGRect){0, 0, size.width, size.height}];

        label.backgroundColor = [UIColorclearColor];

        label.textColor = [UIColor darkGrayColor];

        label.lineBreakMode = NSLineBreakByTruncatingTail;

        label.text = (text ? text : @"");

        label.font = font;

        label.numberOfLines = 2;

        label.tag = COMMENT_LABEL;

        [label sizeToFit];

        return label;

        

    } else {

        //iOS7

        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStylealloc] init];

        paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;

        paragraphStyle.alignment = NSTextAlignmentLeft;

        NSDictionary *attr = @{NSFontAttributeName : font,

                               NSParagraphStyleAttributeName : paragraphStyle};

        NSAttributedString *str = [[NSAttributedString alloc] initWithString:(text ? text : @"")

                                                                  attributes:attr];

        CGRect rect = [str boundingRectWithSize:(CGSize){MSG_MAX_WIDTH, MSG_MAX_HEIGHT}

                                        options:NSStringDrawingUsesLineFragmentOrigin

                                        context:nil];

        label = [[UILabel alloc] initWithFrame:rect];

        label.backgroundColor = [UIColorredColor];

        label.textColor = [UIColor darkGrayColor];

        label.lineBreakMode = NSLineBreakByTruncatingTail;

        label.attributedText = str;

        label.numberOfLines = 2;

        label.tag = COMMENT_LABEL;

        [label sizeToFit];

        return label;

    }

 

}