51

Tech Talk 2011 で、新しいUIAppearance プロトコルに関するスピーチを見ました。まだ多くのドキュメントはありません。私の質問がどこから来たのかを説明するために覚えていることを簡単に要約します。


UIAppearance:

これまでは、すべてのアプリ ビュー コントローラーですべてのナビゲーション バー (ツールバーなど) のプロパティをカスタマイズする必要がありました。新しい外観プロパティを使用すると、アプリ内のすべてのナビゲーション バーを 1 か所で行うことができます。たとえば、ナビゲーション バーの背景画像をカスタマイズする場合は、次のようにします。

[[UINavigationBar appearance] setBackgroundImage:
   [UIImage imageNamed:@"MyImageName"] forBarMetrics:UIBarMetricsDefault]; 

これにより、アプリケーション内のすべてのナビゲーション バーの背景画像が設定されます。を使用しbarMetricsて、画像を横向きモードでも使用するかどうかを指定します。

一部のView Controllerにのみ適用されるように外観を指定したい場合は、オブジェクトの場所を指定することでそれを制御する方法がドキュメントにあります。

[[UIBarButtonItem appearanceWhenContainedIn:
    [ABPeoplePickerNavigationController class], nil] setTintColor:myNavBarColor];

また、言及する価値があるのは、外観設定とは異なる単一のカスタマイズされたインスタンスがある場合、これらのインスタンスは外観プロキシの影響を受けないことです。


いくつかの質問:

a) クラスのどのプロパティがアピアランス プロパティで機能するかを知るにはどうすればよいですか? たとえばUITableView、UIAppearance プロトコルに準拠しているため、次のようなことができると考えていました。

[[UITableView appearance] setBackgroundColor:mytableViewColor];

すべてのテーブル ビューの背景色を操作できますが、できません!

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

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

4

3 に答える 3

37

a) クラスのどのインスタンスがアピアランス プロパティで動作するかを知るにはどうすればよいですか? たとえば、 UITableView は UIAppearance プロトコルに準拠しているため、次のようなことができると考えていました

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

[[UITableView appearance] setBackgroundColor:mytableViewColor];

backgroundColor装飾されていませUI_APPEARANCE_SELECTORUIView.h。したがって、アピアランス プロキシでの使用は技術的にサポートされていません。おそらく機能しますが、(メソッドの装飾がないため) 保証されていません。

からUIAppearance Protocol Reference:

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

(「および関連するアクセサメソッドをマークする必要があることに注意してください...」[強調を追加])


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

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


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

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

于 2011-11-24T20:14:29.290 に答える
4

UIAppearance各クラスのヘッダー内に文書化されています。その中で、最後にマークされているメソッドを探してくださいUI_APPEARANCE_SELECTOR。これらは、外観プロキシを介して呼び出すことができるメソッドです。ヘッダー外のリストは知りません。

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

于 2011-11-24T14:50:11.820 に答える
1

a: 次の行

 [[UITableView appearance] setBackgroundColor:[UIColor blueColor]];

すべてのテーブルビューを青くします! iOS 5 シミュレーターでテストしました。

b: UIAppearance は、 a のすべてのプロパティで機能する必要がありUIViewます。のすべてのサブクラスはUIViewUIAppearance Protocol

c: ほとんどの場合、外観をカスタマイズして呼び出すクラスやメソッドを作成すると思います。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

何かのようなもの:[ApplicationAppearance setApplicationSchemaTo:ASchemaBlue];

編集:

たとえば、UIBarButtonItem は次のメソッドを定義します。

@property(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR;

UIAppearanceContainer プロトコル リファレンスから

UIBarButtonItemクラス リファレンスでは、tintColor が定義されています。

@property(非アトミック、保持) UIColor *tintColor

しかし、UIBarButtonItem.h では次のように定義されています。

@property(nonatomic,retain) UIColor *tintColor __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0) UI_APPEARANCE_SELECTOR;

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

于 2011-11-24T14:50:21.677 に答える