甘いものが好きです

iOS App開発時に感じた疑問や課題、その他の雑感などを書いていきます。

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];