UIAppearance で色や画像を簡単に変える事ができる。
UIAppearance は、iOS5 から導入されたプロトコル。
これを使うと UINavigationBar や UIButton のインスタンスの色を変更することができる。
インスタンスではなくクラスに対して色設定ができるので、画面上で使われている指定されたクラスすべての色を変えることができる。
例えば、アプリ内の全ての UIButton に対して、同じ画像を適用したい場合、以下のように記述する。
// すべてのボタンのスタイルを変更する
UIImage *btnImg = [UIImage imageNamed:@"noimage.png"];
UIImage *btnImgHighlighted = [UIImage imageNamed:@"noimage.png"];
[[UIButton appearance] setBackgroundImage:btnImg forState:UIControlStateNormal];
[[UIButton appearance] setBackgroundImage:btnImgHighlighted forState:UIControlStateHighlighted];
そうすると、アプリ内の UIButton 全ての背景画像が変更される。
また、appearance の代わりに appearanceWhenContainedIn を使うと、指定した親ビューを条件に指定することができる。
例えば、
// 指定した条件のボタンのスタイルを変更する
UIImage *btnImg = [UIImage imageNamed:@"noimage.png"];
UIImage *btnImgHighlighted = [UIImage imageNamed:@"noimage.png"];
// 条件を指定
[[UIButton appearanceWhenContainedIn:[UINavigationBar class], nil]
setBackgroundImage:btnImg forState:UIControlStateNormal];
[[UIButton appearanceWhenContainedIn:[UINavigationBar class], nil]
setBackgroundImage:btnImgHighlighted forState:UIControlStateHighlighted];
こうすると、UINavigationBar (親ビュー) の中の UIButton だけに適用される
親ビューは、複数指定することができる。
条件の指定には、カスタムクラスも指定できる。
これを活用するケースは、例えば、iOS7ベースで開発したアプリを、iOS6に対応させたい場合、1つ1つバージョン判定をして、切り替えるのではなく、application:application didFinishLaunchingWithOptions:launchOptions
などに記述して、アプリ内のものを一括で切り替える事ができる。
ただ、条件が細かったりすると、ちょっと使いづらいので、ケースによっては、カスタムなボタンを作った方がよい場合もあるので、ケースバイケースで、使うことをオススメします。