web-dev-qa-db-ja.com

iOS 5:UIAppearanceに興味がある

2011年のテクニカルトークで、新しいUIAppearanceprotocol についてのスピーチを見ました。まだ多くのドキュメントはありません。私の質問の出所を説明するために覚えていることを簡単にまとめます。


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)外観のカスタマイズはどの時点で呼び出されますか?実行時に外観のプロパティをスローして変更を加えることを望んでいましたが、残念ながら変更は行われていません。

50
d.ennis

a)どのようにして、クラスのどのインスタンスがAppearanceプロパティで機能するかを知ることができますか?例えばUITableViewはUIAppearanceプロトコルに準拠しているので、次のようなことができると思っていました

クラスのヘッダー(およびすべてのスーパークラスのヘッダー)を調べます。 UI_APPEARANCE_SELECTORが横にあるメソッドは、UIAppearanceプロキシでの使用がサポートされています。

[[UITableView appearance] setBackgroundColor:mytableViewColor];

backgroundColorプロパティは、UI_APPEARANCE_SELECTORUIView.hで装飾されていません。したがって、Appearance Proxyでの使用は技術的にサポートされていません。それはおそらく動作しますが、(メソッドの装飾がない場合)は保証されていません。

UIAppearance Protocol Referenceから:

外観のカスタマイズをサポートするには、クラスはUIAppearanceContainerプロトコルに準拠している必要があり、関連するアクセサーメソッドはUI_APPEARANCE_SELECTORでマークされている必要があります。

( "and関連するアクセサメソッドmustマークする..." [強調を追加])に注意してください)


b)外観プロパティで操作可能なすべてのプロパティのリストはありますか?

Appearance Proxyで動作するすべてのセッターを示す単一のページはありますか?私はそれを知りませんし、実行時にリストを作成する方法もありません。


c)どの時点で外観のカスタマイズが呼び出されますか?実行時に外観プロパティをスローして変更を加えたいと思っていましたが、残念ながら変更は行われていません。

実行中の任意の時点で外観プロキシを使用できます。変更は、次にこれらのビューで-layoutSubviewsメソッドが呼び出されるまで、影響を受けるビューに適用されません。

37
Dave DeLong

UIAppearanceは、各クラスのヘッダー内に記載されています。一番最後にUI_APPEARANCE_SELECTORとマークされているメソッドを探します。これらは、Appearanceプロキシを介して呼び出すことができるメソッドです。ヘッダー以外のリストは知りません。

外観のカスタマイズは、プロキシを通過した直後、および新しいオブジェクトが構築されるたびに呼び出されます。しかし、これはUI_APPEARANCE_SELECTORでマークされたメソッドに対してのみ機能します

4
Joshua Weinberg

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

ドキュメントは最新ではないと思います。

2
Alex Terente