iphone - framework - swift ios documentation
iOS 5: Curioso sobre UIAppearance (3)
a) ¿Cómo sé qué instancias de una clase trabajan con la propiedad de apariencia? Por ejemplo, dado que UITableView se ajusta al protocolo de apariencia UIA, estaba pensando que podría hacer algo como
Miras en el encabezado de la clase (y en los encabezados de todas las superclases). Cualquier método que tenga UI_APPEARANCE_SELECTOR
junto a él es compatible para su uso con el proxy UIAppearance
.
[[UITableView appearance] setBackgroundColor:mytableViewColor];
La propiedad backgroundColor
no está decorada con UI_APPEARANCE_SELECTOR
en UIView.h
. Por lo tanto, no se admite técnicamente para su uso con el proxy de apariencia. Probablemente funcionará, pero (dada la falta de decoración del método) no está garantizado.
De la UIAppearance Protocol Reference
:
Para admitir la personalización de la apariencia, una clase debe cumplir con el protocolo
UIAppearanceContainer
y los métodos de acceso relevantes deben estar marcados conUI_APPEARANCE_SELECTOR
.
(nota " y los métodos de acceso relevantes deben estar marcados ..." [énfasis agregado])
b) ¿Hay una lista de todas las propiedades que son manipulables con la propiedad de apariencia?
¿Hay una sola página que muestre cada configurador que funcione con el proxy de apariencia? No conozco ninguno, ni hay una manera de construir la lista en tiempo de ejecución.
c) ¿En qué momento se llama la personalización de la apariencia? Tenía la esperanza de hacer cambios en la propiedad de apariencia en el tiempo de ejecución, pero desafortunadamente los cambios no están ocurriendo.
Puede utilizar el proxy de apariencia en cualquier momento durante la ejecución. Los cambios no se aplicarán a las vistas afectadas hasta la próxima vez que esas vistas tengan invocado su método -layoutSubviews
.
En la charla técnica de 2011, vi un discurso sobre el nuevo protocol UIAppearance
. Todavía no hay mucha documentación por ahí. Resumiré brevemente lo que recuerdo para explicar de dónde viene mi pregunta:
Sobre UIAppearance
:
Hasta ahora, tenía que personalizar la propiedad de CADA barra de navegación (barra de herramientas, etc.) en todos los controladores de vista de aplicaciones. Con la nueva propiedad de apariencia, puede hacerlo en un solo lugar para todas las barras de navegación en su aplicación. Por ejemplo: si desea personalizar la imagen de fondo de la barra de navegación, puede hacerlo así:
[[UINavigationBar appearance] setBackgroundImage:
[UIImage imageNamed:@"MyImageName"] forBarMetrics:UIBarMetricsDefault];
Esto establecerá la imagen de fondo de TODAS las barras de navegación dentro de su aplicación. Con barMetrics
especifica si desea que la imagen se utilice también en modo horizontal o no.
Si desea especificar la apariencia que se aplicará solo en algunos controladores de vista, también hay un método en los documentos para controlar eso especificando dónde se ubican sus objetos:
[[UIBarButtonItem appearanceWhenContainedIn:
[ABPeoplePickerNavigationController class], nil] setTintColor:myNavBarColor];
También vale la pena mencionar que, si tiene instancias únicas personalizadas, que difieren de la configuración de su apariencia, estas instancias no se verán afectadas por el proxy de apariencia.
Algunas preguntas:
a) ¿Cómo sé qué propiedades de una clase funcionan con la propiedad de apariencia? Por ejemplo, dado que UITableView
ajusta al protocolo de apariencia UIA, estaba pensando que podría hacer algo como
[[UITableView appearance] setBackgroundColor:mytableViewColor];
Para manipular el color de fondo de todas mis vistas de tabla, ¡pero no puedo!
b) ¿Hay una lista de todas las clases que son manipulables con la propiedad de apariencia?
c) ¿En qué momento se llama la personalización de la apariencia? Tenía la esperanza de hacer cambios en la propiedad de apariencia en el tiempo de ejecución, pero desafortunadamente los cambios no están ocurriendo.
a: la siguiente linea
[[UITableView appearance] setBackgroundColor:[UIColor blueColor]];
¡Hará que todas las mesas sean azules! Solo probado en simulador de iOS 5.
b: La apariencia UIA debería funcionar en cada propiedad en una vista UIView
. Todas las subclases de UIView
ajustan al UIAppearance Protocol
c: Creo que la mayoría creará una clase o un método que personalizará la apariencia y lo llamará en:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Algo como: [ApplicationAppearance setApplicationSchemaTo:ASchemaBlue];
Editar:
Por ejemplo, UIBarButtonItem define estos métodos:
@ propiedad (no atómica, retener) UIColor * tintColor UI_APPEARANCE_SELECTOR;
De la referencia del protocolo UIAppearanceContainer
Y en la referencia de clase UIBarButtonItem se define tintColor
@propiedad (no atómica, retener) UIColor * tintColor
Pero en el UIBarButtonItem.h se define:
@property(nonatomic,retain) UIColor *tintColor __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0) UI_APPEARANCE_SELECTOR;
Creo que los documentos no están actualizados.
UIAppearance
se documenta dentro de los encabezados de cada clase. Busque allí los métodos marcados como UI_APPEARANCE_SELECTOR
al final. Esos son los métodos que puede llamar a través del proxy de apariencia. No estoy al tanto de una lista fuera de los encabezados.
La personalización de la apariencia se llama inmediatamente después de pasar por el proxy, así como cada vez que se construye un nuevo objeto. Pero esto solo funcionará para los métodos marcados con ese UI_APPEARANCE_SELECTOR