web-dev-qa-db-fra.com

iOS 5: curieux de connaître UIAppearance

Lors de la conférence technique 2011, j'ai vu un discours sur le nouveau UIAppearanceprotocole . Il n'y a pas encore beaucoup de documentation. Je vais résumer brièvement ce dont je me souviens pour expliquer d'où vient ma question:


À propos de UIAppearance :

Jusqu'à présent, vous deviez personnaliser CHAQUE propriété de barre de navigation (barre d'outils, etc.) dans tous vos contrôleurs de vue d'application. Avec la nouvelle propriété d'apparence, vous pouvez le faire en un seul endroit pour toutes les barres de navigation de votre application. Par exemple: si vous souhaitez personnaliser votre image d'arrière-plan de la barre de navigation, vous pouvez le faire comme ceci:

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

Cela définira l'image d'arrière-plan de TOUTES les barres de navigation dans votre application. Avec le barMetrics, vous spécifiez si vous souhaitez que l'image soit également utilisée en mode paysage.

Si vous souhaitez spécifier l'apparence à appliquer uniquement dans certains contrôleurs de vue, il existe également une méthode dans les documents pour contrôler cela en spécifiant où se trouvent vos objets:

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

Il convient également de mentionner que si vous avez des instances personnalisées uniques, différentes de vos paramètres d'apparence, ces instances ne seront pas affectées par le proxy d'apparence.


Quelques questions:

a) Comment savoir quelles propriétés d'une classe fonctionnent avec la propriété apparence? Par exemple puisque UITableView est conforme au protocole UIAppearance, je pensais pouvoir faire quelque chose comme

[[UITableView appearance] setBackgroundColor:mytableViewColor];

pour manipuler la couleur d'arrière-plan de toutes mes vues de table, mais je ne peux pas!

b) Existe-t-il une liste de toutes les classes manipulables avec la propriété apparence?

c) À quel moment la personnalisation de l'apparence est-elle appelée? J'espérais apporter des modifications a jeté la propriété d'apparence au moment de l'exécution, mais malheureusement, les modifications n'ont pas lieu.

50
d.ennis

a) Comment savoir quelles instances d'une classe fonctionnent avec la propriété apparence? Par exemple comme UITableView est conforme au protocole UIAppearance, je pensais pouvoir faire quelque chose comme

Vous regardez dans l'en-tête de la classe (et les en-têtes de toutes les superclasses). Toute méthode qui a UI_APPEARANCE_SELECTOR à côté est pris en charge pour une utilisation avec le proxy UIAppearance.

[[UITableView appearance] setBackgroundColor:mytableViewColor];

La propriété backgroundColor n'est pas décorée avec UI_APPEARANCE_SELECTOR dans UIView.h. Il n'est donc pas techniquement pris en charge pour une utilisation avec le proxy d'apparence. Cela fonctionnera probablement , mais (étant donné le manque de décoration de méthode) n'est pas garanti.

Du UIAppearance Protocol Reference:

Pour prendre en charge la personnalisation de l'apparence, une classe doit être conforme au protocole UIAppearanceContainer et les méthodes d'accesseur pertinentes doivent être marquées avec UI_APPEARANCE_SELECTOR.

(note "et méthodes d'accesseur pertinentes doit être marqué ..." [non souligné dans l'original])


b) Existe-t-il une liste de toutes les propriétés manipulables avec la propriété d'apparence?

Existe-t-il une seule page affichant chaque setter qui fonctionne avec le proxy d'apparence? Je n'en connais pas et il n'y a aucun moyen de construire la liste au moment de l'exécution.


c) À quel moment la personnalisation de l'apparence est-elle appelée? J'espérais apporter des modifications a jeté la propriété d'apparence au moment de l'exécution, mais malheureusement, les modifications n'ont pas lieu.

Vous pouvez utiliser le proxy d'apparence à tout moment pendant l'exécution. Les modifications ne seront appliquées aux vues affectées que la prochaine fois que ces vues auront leur -layoutSubviews méthode invoquée.

37
Dave DeLong

UIAppearance est documenté dans les en-têtes de chaque classe. Regardez à l'intérieur pour les méthodes marquées UI_APPEARANCE_SELECTOR à la fin. Ce sont les méthodes que vous pouvez appeler via le proxy d'apparence. Je ne connais pas de liste en dehors des en-têtes.

La personnalisation de l'apparence est appelée immédiatement après avoir traversé le proxy, ainsi que chaque fois qu'un nouvel objet est construit. Mais cela ne fonctionnera que pour les méthodes marquées de ce UI_APPEARANCE_SELECTOR

4
Joshua Weinberg

a: La ligne suivante

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

Rendra chaque vue de table bleue! Je viens de tester sur le simulateur iOS 5.

b: l'apparence UIA devrait fonctionner sur chaque propriété sur un UIView. Toutes les sous-classes de UIView sont conformes à UIAppearance Protocol

c: Je pense que la plupart créeront une classe et/ou une méthode qui personnalisera l'apparence et l'appellera dans:

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

Quelque chose comme: [ApplicationAppearance setApplicationSchemaTo:ASchemaBlue];

Éditer:

Par exemple, UIBarButtonItem définit ces méthodes:

@property (nonatomique, conserver) UIColor * tintColor UI_APPEARANCE_SELECTOR;

De Référence du protocole UIAppearanceContainer

Et dans le IBarButtonItem Class Reference le tintColor est défini

@property (nonatomique, conserver) UIColor * tintColor

Mais dans UIBarButtonItem.h est défini:

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

Je pense que les documents ne sont pas à jour.

2
Alex Terente