2011-08-22 8 views
22

¿Cuál es el método recomendado para diseñar una aplicación de iOS? Por ejemplo, si hay varias etiquetas o vistas de texto, ¿cómo se puede actualizar el estilo/color de la fuente en un lugar para actualizar el estilo/color en todos los demás lugares?¿Cuál es el método recomendado para diseñar una aplicación de iOS?

Sé que la subclase podría ser de una sola manera ... ¿hay alguna otra?

+0

Es posible que tenga que mirar esta biblioteca. Admite múltiples temas/máscaras sobre la marcha. Admite imágenes y colores actualmente. El soporte de fuentes se agregará en el futuro. https://github.com/charithnidarsha/MultiThemeManager –

Respuesta

9

Se puede importar un archivo de cabecera estándar en todos sus controladores con varias constantes seleccionadas para el peinado ... ejemplo:

Styles.h

#define kFontSize 14 
#define kFontFamily @"Helevetica" 

controlador

#import "Styles.h" // at the top 

myLabel.font = [UIFont fontWithName:kFontFamily size:kFontSize]; 

Personalmente, creo que Interface Builder es la mejor manera de estilo, howe esto responde su pregunta directamente.

+4

no lo rechazaré, pero ... si se elige ir por esa ruta, declaraciones externas como: 'extern const CGFloat MONDarkThemeFontSize;' y 'extern NSString * const MONDarkThemeFontName; 'son preferibles a' #define kShortName value' por varias razones. – justin

+0

Preferiría porque creo que esta es la manera más fácil y adecuada para la aplicación en la que estoy trabajando. Gracias Alex y @Justin. – Yogesh

+0

Esto no es una buena idea. – DexterW

3

Similar a la idea de Alex, se podría crear una clase estática llamada ThemeManager:

typedef enum 
{ 
    defaultStyle, 
    redStyle, 
} ThemeStyles; 

@interface Level : NSObject 
{ 
    ThemeStyles currentTheme; 
} 

Todas las clases que se pueden aplicar temas importará ThemeManager. A continuación, puede crear métodos como:

+ (UIColor*) fontColor; 

¿Qué otras clases llamarían cuando quieren un color de su fuente. Entonces, si usted quiere cambiar los temas, se podría aplicar fontColor como:

+ (UIColor*) fontColor 
{ 
    switch (currentTheme) 
    { 
     case defaultStyle: 
     return [UIColor blackColor]; 
     case redStyle: 
     return [UIColor redColor]; 
    } 
} 

Cuando se quiere cambiar el tema, usted podría tener ThemeManager poner en práctica un método como:

+ (void) changeTheme:(ThemeStyles)newTheme 
{ 
    currentTheme = newTheme; 
} 
6

Francamente, el mejor La forma de hacerlo es usar Interface Builder. Si bien puede parecer agradable cambiar una constante en alguna parte del código y hacer que toda la aplicación cambie de estilos, nunca funciona de esa manera. Estos son mis razonamientos:

1) Los desarrolladores no escriben el código de interfaz sino también el constructor de interfaz. Interface Builder es una herramienta que ha sido refinada, probada y recomendada durante años. Ofrece fuentes, alineación de texto, sombras, etc. Es retrocompatible desde el momento que siempre quisieras. Proporciona una manera muy simple para cualquier cantidad de desarrolladores y diseñadores para saltar y trabajar en algo muy sencillo.

2) Siempre hay casos extremos que tendrá que tener en cuenta. Claro, una constante simple hará lo que quieras la mayoría del tiempo, pero eventualmente tendrás que hackear algo aquí y esconder algo allí. El código de interfaz "simple" que escribió para comenzar crecerá, crecerá y crecerá. Otros desarrolladores tendrán que mantener ese código. Tendrás que mantener ese código. Tendrás que archivar y corregir errores, modificar esto, excepto eso, etc. Inevitablemente se convertirá en una pila de desorden humeante.

3) Cuantos más códigos escribas, más errores escribes. El constructor de interfaces es para construir el 'aspecto' de la mayoría de las aplicaciones de iOS. Úselo. No seas demasiado inteligente.

NOTA: Entiendo que el creador de interfaces no puede hacer todo para todas las aplicaciones. Hay casos en que la codificación de una interfaz es la única solución. Esta respuesta es simplemente una "mejor práctica" general que uso en la mayor parte de mis aplicaciones.

+2

+1. Simplemente haga puntas separadas con diferentes estilos y vuelva a cargar vistas. –

+1

Todavía encuentro aplicaciones que debes administrar o diseñar UI a través de Objective-C. Es bueno saber cómo hacerlo. – BlueConga

9

Actualización: Recomendaría comenzar por comprender UIAppearance API, y ver qué tan bien se adaptan a sus necesidades. UIAppearance es una forma conveniente de proporcionar una estilización predeterminada personalizada de los atributos de controles específicos en múltiples niveles (por ejemplo, global o contextualmente).


Mi respuesta original, que es anterior a UIAppearance 's disponibilidad:


ya que estamos trabajando con un lenguaje basado en objetos ...

para la ejecución, que depende sobre cómo quieres que se comporte/ejecute. cuando la implementación no sea trivial, a menudo crearé un protocolo. usted podría utilizar métodos de clase o métodos de instancia y de manera significativa optimizar estos tipos para su uso porque se crea un menor número de colores intermedios, fuentes, imágenes, etc.

una interfaz básica podría tomar la forma:

@protocol MONLabelThemeProtocol 

- (UIFont *)labelFont; 
- (UIColor *)labelTextColor; 
- (UITextAlignment)labelTextAlignment; 
// ... 
@end 

@protocol MONTableViewCellThemeProtocol 

- (UIFont *)tableViewCellFont; 
- (UIColor *)tableViewCellTextColor; 
- (UIImage *)tableViewCellImage; 
- (NSInteger)tableViewCellIndentationLevel; 
- (CGFloat)tableViewCellIndentationWidth; 
// ... 
@end 

luego una tema amalgamate simple podría ser declarado como esto:

@interface MONAmalgamateThemeBase : NSObject 
    < MONLabelThemeProtocol, MONTableViewCellThemeProtocol > 
{ 
@protected 
    /* labels */ 
    UIFont * labelFont; 
    UIColor * labelTextColor; 
    UITextAlignment labelTextAlignment; 
    // ... 
    /* table view cells */ 
    UIFont * tableViewCellFont; 
    UIColor * tableViewCellTextColor; 
    UIImage * tableViewCellImage; 
    NSInteger tableViewCellIndentationLevel; 
    CGWidth tableViewCellIndentationWidth; 
    // ... 
} 

@end 

en este ejemplo, el amalgamate define los captadores y dealloc y espera las subclases para inicializar las variables de instancia. también podría admitir la inicialización lenta si los tiempos de inicialización son altos (por ejemplo, usa muchas imágenes).

entonces una especialización podría tomar la forma:

@interface MONDarkTheme : MONAmalgamateThemeBase 
@end 

@implementation MONDarkTheme 

- (id)init 
{ 
    self = [super init]; 
    if (nil != self) { 
     labelFont = [[UIFont boldSystemFontOfSize:15] retain]; 
     labelTextColor = [[UIColor redColor] retain]; 
     // and so on... 
    } 
    return self; 
} 

// ... 

@end 

/* declare another theme and set it up appropriately */ 
@interface MONLightTheme : MONAmalgamateThemeBase 
@end 

a continuación, sólo reutilizar los casos tema (por ejemplo MONDarkTheme) a lo largo de la aplicación para estilizar las vistas. si tiene muchos temas o no son triviales para construir, entonces puede querer crear una colección para temas (administrador de temas). el amalgama también podría tomar un parámetro, como init con theme si tus necesidades son simples. incluso puede configurar objetos para registrar cambios en los temas, si necesita soporte para cambios dinámicos.

por último, puede crear un simple aplicador tema para hacer la vida más fácil - de este modo:

@interface UILabel (MONThemeAdditions) 

- (void)mon_applyMONLabelTheme:(id<MONLabelTheme>)theme; 

@end 

@implementation UILabel (MONThemeAdditions) 

- (void)mon_applyMONLabelTheme:(id<MONLabelTheme>)theme 
{ 
    assert(theme); 
    if (nil == theme) return; 
    self.font = [theme labelFont]; 
    self.textColor = [theme labelTextColor]; 
    self.textAlignment = [theme labelTextAlignment]; 
} 

@end 
+0

Me gusta esta respuesta, aunque es bastante antigua. ¿Qué tan aplicable es esto ahora que tenemos UIAppearance API? – bandejapaisa

+0

@bandejapaisa He actualizado mi respuesta. hay 105 apariciones de 'UI_APPEARANCE_SELECTOR' en iOS7; hay suficiente control para la mayoría de las necesidades de las aplicaciones. si necesita más granularidad o control de memoria, atributos, estilos o funcionalidades del aplicador (realmente, recién estaba empezando con las posibilidades), el enfoque anterior puede ofrecerle todo el control disponible. también me gusta porque no es necesariamente global ni intrusivo. Veo los enfoques como similares, pero "UIAppearance" se inclina hacia la conveniencia, mientras que el mío se inclina hacia el control. Además, tiendo a escribir UI ... – justin

+0

@bandejapaisa ... programáticamente, por lo que esto tiende a ser un problema recurrente en la localidad alta (es fácil de aplicar y enviar temas cuando todos los detalles existen en el mismo lugar). se vuelve más difícil cuando los detalles existen en varios lugares, cuando se incorporan guiones gráficos, XIB y algún código. Por lo tanto, será menos conveniente introducir y aplicar estos temas programáticos cuando cosas como la inicialización se trasladen del origen a la carga de SB/XIB. en ese caso, puede anular solo para aplicar temas. – justin

1

utilizo plists. Del mismo modo que localizo las cadenas, uso el mismo procedimiento para cambiar los temas. Codifiqué un singleton que carga un plist de tema actual y un plist de repliegue. Luego reemplazo los nombres de los recursos con claves y macro funciones que extraen el nombre del recurso real desde el singleton.

Contras: tiene que establecer el recurso para cada elemento, no solo configurarlo en el NIB.
Ventajas: una vez que haya terminado, la mayor parte del siguiente tema implica photoshop y textmate, no IB o código.

3

Se puede utilizar una abstracción de terceros de UIAppearance:

El uso de un guión gráfico tiene un montón de ventajas, pero muchas opciones de estilo no están disponibles, de las cuales las fuentes personalizadas no son las menos importantes. Si desea una interfaz de usuario profundamente personalizada, necesitará algún código de estilo para hacerlo realidad.

Cuestiones relacionadas