appearanceプロキシを使ってUI要素の外見を一括カスタマイズ
iOS 5.0より前のバージョンのiOS SDKではUI要素の外見をカスタマイズするためには、
- 各オブジェクトごとにプロパティの変更等の個別設定を行う
- サブクラス化してdrawRect:をオーバーライドする
などの方法をとらなければらななかったが、iOS 5.0では各種UI要素のクラスにいくつかのメソッドが追加されており、それらを使用することにより従来より容易にUI要素の外見を制御できる。また、iOS 5.0で追加されたUIAppearanceプロトコルを利用すれば、様々なUI要素の外見を一括でカスタマイズすることができる。
サンプルプロジェクト
User Interface Customization in iOS 5 - Ray Wenderlich
上記リンク先の記事では、Navigation Bar, Bar Button Item, Text Field, Slider, Switch, Segmented Control, Tab Barなどの外見のカスタマイズを行なっている。個人的には、appearanceプロキシとUIImageクラスの新規インスタンスメソッドresizableImageWithCapInsets:の使い勝手の良さに感動した。
appearanceプロキシでUI要素の外見を一括管理
UI要素クラスがUIAppearanceプロトコルを実装している場合には、そのUIAppearanceプロトコルのメソッドappearanceにより、そのUI要素の外見を管理するプロキシを取得することができる。そして、このプロキシ経由で外見に関わる設定を行うことにより、そのUI要素の外見を一括で設定することができる。
[[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
また、UIAppearanceプロトコルのappearanceWhenContainedIn:メソッドによって取得したプロキシを使用すると、親Viewの種類に応じたUI要素の外見設定を行うことができる。例えば、Bar Button ItemはNavigation BarとToolbarのどちらにも追加することができるが、次のようなコードを実行すると、Navigation Barに追加されているBar Button Itemの外見はカスタマイズされるが、Toolbarに追加されているBar Button Itemの外見は変化しない。
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setBackgroundImage:image forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
プロキシとは
プロキシとはObjective-Cが提供する、プロセス間通信等を実現する概念の構成要素である。マイコミジャーナルのコラムでプロキシについて詳しく説明されている。