Establezca el color (u otras properties) de UIView en el file xib POR TARGET

Estoy trabajando en algunas aplicaciones diferentes que reutilizan el mismo file xib, pero cada aplicación tiene su propio esquema de colors.

Para la mayoría de las partes de la aplicación (color de la barra de UIBarButtonItem , UIBarButtonItem ), usamos el método UIAppearance para cada aplicación.

Para algunas partes, sin embargo, se vuelve más complicado, como el color de las tags debe ser de color A, B y C para la aplicación 1, y debe ser Color B, C y D para la aplicación 2, y no puedo piense en una manera fácil de hacerlo con UIAppearance .

Una forma obvia y difícil de hacer esto sería en algún lugar cuando el controller de la vista se carga para establecer los colors de la label allí, y tener los colors almacenados en un plist o algo similar. También podría duplicar el xib para cada proyecto y editar los colors en el xib, pero vence el propósito de compartir las xibs y tendría que actualizar constantemente múltiples xib para cada cambio a la interfaz de usuario.

Sin embargo, tengo curiosidad si pudiera usar los " User Defined Runtime Attributes " o alguna otra cosa que sea fácil de manejar para abordar este problema.

¡Gracias por adelantado!

Haz dos destinos nombrados

networkingColor blueColor

en ambos, Goto Build Settings> establecer macros de pre procesador>

para networkingColor> agregar Preprocessor Macro IS_RED_THEME para blueColor> agregar Preprocessor Macro IS_BLUE_THEME

Ahora en tu class

en viewWillAppear o en viewDidLoad o en cualquier lugar donde quieras poner este código:

 #ifdef IS_RED_THEME //apply Red COlor #elif IS_BLUE_THEME //apply Blue Color #endIf 

También puedes usar otras banderas C que se combinan con -D

como -DIS_RED_THEME

Para mi opinión, creé una class llamada "Paleta", y en esta class, creé algunos colors constantes. Al iniciar mi aplicación, inicio esta class (solo una vez), y puedo tener acceso a todos los colors que deseo en mi aplicación. Aquí un ejemplo:

Paleta.h :

 /* HEXA to RGB */ #define UIColorFromRGB(hexValue) [UIColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:1.0] /* Used colors in app */ #define kColor1 UIColorFromRGB(0xFFFFFF) #define kColor2 UIColorFromRGB(0x48CF35) @interface Palette : NSObject + (Palette *)shanetworking; #pragma mark - Colors @property (nonatomic, readonly)UIColor *color1; @property (nonatomic, readonly)UIColor *color2; 

Y mi paleta.m :

 @implementation Palette { UIColor *color1; UIColor *color2; } + (Palette *)shanetworking { static Palette *instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[Palette alloc] init]; }); return instance; } - (id)init { self = [super init]; if(self) { //... } return self; } #pragma mark - Colors - (UIColor *)color1 { if(nil == color1) color1 = kColor1; return color1; } - (UIColor *)color2 { if(nil == color2) color2 = kColor2; return color2; } 

A continuación, agrego la class Pallete.h en mi file app-Prefix.pch para tener acceso a cualquier parte. Finalmente, en el delegado de mi aplicación cuando appDidFinishLaunchingWithOptions, simplemente llamé:

 [Palette shanetworking]; 

Y para agregar color para un UILabel:

 UILabel *label = [UILabel new]; [label setText:@"My label"]; [label setTextColor:[[Palette shanetworking] color1]]; 

Espero eso ayude 😉

entonces ya tenemos 2 soluciones posibles:

  1. Singleton que contiene colors de Lapinou
  2. Macros del preprocesador por Xeieshan

Puedo pensar en 3 adicionales:

  1. NSUserdefaults (funciona como singleton) Puede configurar todos los colors en NSUserDefaults como runonce y cargarlos en cada controller. Puede archivar los colors en NSData y cargarlos directamente o cargar una cadena hexadecimal y crearla cuando la necesite.
  2. Cree un object al comienzo sosteniendo todos los colors (ButtonPrimary, ButtonSecondary, etc … como el singleton) y páselo a través de su navigation.
  3. Agregue una categoría a NSObject que contenga todos los colors. Deberían estar disponibles en todas partes ahora.

No puedo decir mucho performance, pero creo que el singleton sugerido por Lapinou hará su trabajo. Simplemente asegúrate de nombrar esas properties en consecuencia (LabelTextPrimary, LabelBorderFine, LabelBorderThick, etc.) ya que color1, color2, color3 te romperá el cuello muy pronto.

En una nota personal, estoy usando 1 + 2 (mi list), ya que puedo elegir libremente usar el esquema de colors global (nsuserdefault) mientras que un controller de navigation significativo usa el suyo propio.

Si quiere ir con NSUserDefaults esto puede ayudar.

 - (UIColor *) createColorFromHex:(NSString *)hexString { NSString *cleanString = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""]; if([cleanString length] == 3) { cleanString = [NSString stringWithFormat:@"%@%@%@%@%@%@", [cleanString substringWithRange:NSMakeRange(0, 1)],[cleanString substringWithRange:NSMakeRange(0, 1)], [cleanString substringWithRange:NSMakeRange(1, 1)],[cleanString substringWithRange:NSMakeRange(1, 1)], [cleanString substringWithRange:NSMakeRange(2, 1)],[cleanString substringWithRange:NSMakeRange(2, 1)]]; } if([cleanString length] == 6) { cleanString = [cleanString stringByAppendingString:@"ff"]; } unsigned int baseValue; [[NSScanner scannerWithString:cleanString] scanHexInt:&baseValue]; float networking = ((baseValue >> 24) & 0xFF)/255.0f; float green = ((baseValue >> 16) & 0xFF)/255.0f; float blue = ((baseValue >> 8) & 0xFF)/255.0f; float alpha = ((baseValue >> 0) & 0xFF)/255.0f; // NSLog(@"SUCCESS; Color created: %f, %f, %f, %f from %@",networking,green,blue,alpha,cleanString); return [UIColor colorWithRed:networking green:green blue:blue alpha:alpha]; } 

EDIT: stackoverflow está arruinando mis numbers: D