2011年のテクニカルトークで、新しいUIAppearance
protocol についてのスピーチを見ました。まだ多くのドキュメントはありません。私の質問の出所を説明するために覚えていることを簡単にまとめます。
UIAppearance
:について
これまでのところ、すべてのアプリビューコントローラーのすべてのナビゲーションバー(ツールバーなど)プロパティをカスタマイズする必要がありました。新しいAppearanceプロパティを使用すると、アプリ内のすべてのナビゲーションバーを1か所で表示できます。たとえば、ナビゲーションバーの背景画像をカスタマイズする場合は、次のようにします。
[[UINavigationBar appearance] setBackgroundImage:
[UIImage imageNamed:@"MyImageName"] forBarMetrics:UIBarMetricsDefault];
これにより、アプリケーション内のすべてのナビゲーションバーの背景画像が設定されます。 barMetrics
では、画像を横長モードでも使用するかどうかを指定します。
一部のビューコントローラーでのみ適用される外観を指定する場合、オブジェクトの場所を指定することでそれを制御するメソッドもドキュメントにあります。
[[UIBarButtonItem appearanceWhenContainedIn:
[ABPeoplePickerNavigationController class], nil] setTintColor:myNavBarColor];
特筆に値するのは、外観の設定とは異なり、単一のカスタマイズされたインスタンスがある場合、これらのインスタンスは外観プロキシの影響を受けないことです。
いくつかの質問:
a)どのようにして、クラスのどのプロパティがAppearanceプロパティで機能するかを知るには?たとえばUITableView
はUIAppearanceプロトコルに準拠しているので、次のようなことができると思っていました
[[UITableView appearance] setBackgroundColor:mytableViewColor];
すべてのテーブルビューの背景色を操作しますが、できません!
b)外観プロパティで操作できるすべてのクラスのリストはありますか?
c)外観のカスタマイズはどの時点で呼び出されますか?実行時に外観のプロパティをスローして変更を加えることを望んでいましたが、残念ながら変更は行われていません。
a)どのようにして、クラスのどのインスタンスがAppearanceプロパティで機能するかを知ることができますか?例えばUITableViewはUIAppearanceプロトコルに準拠しているので、次のようなことができると思っていました
クラスのヘッダー(およびすべてのスーパークラスのヘッダー)を調べます。 UI_APPEARANCE_SELECTOR
が横にあるメソッドは、UIAppearance
プロキシでの使用がサポートされています。
[[UITableView appearance] setBackgroundColor:mytableViewColor];
backgroundColor
プロパティは、UI_APPEARANCE_SELECTOR
のUIView.h
で装飾されていません。したがって、Appearance Proxyでの使用は技術的にサポートされていません。それはおそらく動作しますが、(メソッドの装飾がない場合)は保証されていません。
UIAppearance Protocol Reference
から:
外観のカスタマイズをサポートするには、クラスは
UIAppearanceContainer
プロトコルに準拠している必要があり、関連するアクセサーメソッドはUI_APPEARANCE_SELECTOR
でマークされている必要があります。
( "and関連するアクセサメソッドmustマークする..." [強調を追加])に注意してください)
b)外観プロパティで操作可能なすべてのプロパティのリストはありますか?
Appearance Proxyで動作するすべてのセッターを示す単一のページはありますか?私はそれを知りませんし、実行時にリストを作成する方法もありません。
c)どの時点で外観のカスタマイズが呼び出されますか?実行時に外観プロパティをスローして変更を加えたいと思っていましたが、残念ながら変更は行われていません。
実行中の任意の時点で外観プロキシを使用できます。変更は、次にこれらのビューで-layoutSubviews
メソッドが呼び出されるまで、影響を受けるビューに適用されません。
UIAppearance
は、各クラスのヘッダー内に記載されています。一番最後にUI_APPEARANCE_SELECTOR
とマークされているメソッドを探します。これらは、Appearanceプロキシを介して呼び出すことができるメソッドです。ヘッダー以外のリストは知りません。
外観のカスタマイズは、プロキシを通過した直後、および新しいオブジェクトが構築されるたびに呼び出されます。しかし、これはUI_APPEARANCE_SELECTOR
でマークされたメソッドに対してのみ機能します
a:次の行
_ [[UITableView appearance] setBackgroundColor:[UIColor blueColor]];
_
すべてのテーブルビューを青にします! iOS 5シミュレータでテストされました。
b:UIAppearanceはUIView
のすべてのプロパティで機能します。 UIView
のすべてのサブクラスは_UIAppearance Protocol
_に準拠しています
c:ほとんどは、外観をカスタマイズしてそれを呼び出すクラスまたはメソッドを作成すると思います。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
次のようなもの:_[ApplicationAppearance setApplicationSchemaTo:ASchemaBlue];
_
編集:
たとえば、UIBarButtonItemはこれらのメソッドを定義します。
@property(nonatomic、retain)UIColor * tintColor UI_APPEARANCE_SELECTOR;
From IAppearanceContainer Protocol Reference
そして IBarButtonItem Class Reference でtintColorが定義されています
@property(nonatomic、retain)UIColor * tintColor
しかし、UIBarButtonItem.hで定義されています。
_@property(nonatomic,retain) UIColor *tintColor __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0) UI_APPEARANCE_SELECTOR;
_
ドキュメントは最新ではないと思います。