Septeni Engineer's Blog

セプテーニエンジニアが綴る技術ブログ

【objective-c】文字表現の幅を広げる

こんにちは!1年目のオカモトです。
今日で1年目も終わると思うと、びっくりです。



ちなみに、セプテーニでは1年目のことをブランニュー、略してBNと呼びます!

何か変ですよね笑

iPhoneアプリを作っていると、UILabelとかUITextViewを使うシーンも多いと思うのですが、結構使い勝手が悪く感じることも多く、


「文字色を一部だけ変えて強調したい」なんて時には、UILabelなら複数用意しないといけないのか?と頭を抱えがちです。

iOS6からはNSAttributedStringっちゅうのが標準サポートしたようで、これを使って色やフォントを変えてみました。



今回は

3月が終わるっ!!!

というのを表現してみましょう。

1.NSAttributedStringを用意する

考え方としては、



(1)[3月が] (2)[終わるっ] (3)[!!!]
という3要素に分解して、各要素ごとにNSAttributedStringを作ったのち連結します。

Rangeを指定して、[終わるっ]の部分だけ変更を加える事もできますが、僕は分解して後から繋ぐほうが好きです。



まず、(2)[終わるっ]の要素から作ります。

NSAttributedString *end = [[NSAttributedString alloc] initWithString:@"終わるっ"
       attributes:@{
         NSForegroundColorAttributeName : [UIColor redColor], 
         NSFontAttributeName : [UIFont boldSystemFontOfSize:20]
         }
       ];

NSStringを作る要領とほとんど同じで、引数attributesの中に描画したい変更を加えます。

attributesはNSDictionary型なので、上記のように色を変える+フォント変更などにも対応できるようです。



他にも影をつけたり、下線を引いたりも可能だったはず。



次に、(1)(3)。attributesの指定もないのでNSStringと同じですね。



NSAttributedString *march = [[NSAttributedString alloc] initWithString:@"3月が"];
NSAttributedString *exclamation = [[NSAttributedString alloc] initWithString:@"!!!"];



各要素が揃ったところで、これをつなぎ合わせます。



NSMutableAttributedString *endMarch = [[NSMutableAttributedString alloc] initWithAttributedString:march];
[endMarch appendAttributedString:end];
[endMarch appendAttributedString:exclamation];

2.UILabelに貼る



UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(略)];
[self.view addSubview:label]; 
label.attributedText = endMarch;



.textが.attributedTextに変わるだけで、他は今までと変わりません。


これを実行すれば、3月が終わってしまう哀愁ただよう文字が出てくるはずです!



ちなみに・・・

このプロパティはiOS6しか標準では持ってないので、iOS5以前の対応は別途必要となります。

機能拡張のためのサブクラスが用意されているので、ご興味のある方は下記の記事を参考になさってみてください。 1つめで紹介されているOHAttributedLabelなんかは結構手軽に触ることができました!



UILabelでのテキスト表示をリッチにする機能拡張サブクラス3種