2010-04-27 22 views
57

Quiero hacer algo como esto, pero no puedo obtener una sintaxis cooperativa.¿Cómo defino los valores constantes de UIColor?

static const UIColor *colorNavbar = [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]; 

Supongo que podría definir macros, pero son feos.

+0

Sí, Objective-C es más específico de un idioma, pero está en el iPhone en este caso. – mobibob

+0

'static UIColor * const color = ....' es posible en Objective-C++. Simplemente cambie la extensión para '* .mm'. –

Respuesta

123

Me gusta usar categorías para extender clases con nuevos métodos para este tipo de cosas. He aquí un extracto de código que acabo de escribir hoy:

@implementation UIColor (Extensions) 

+ (UIColor *)colorWithHueDegrees:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness { 
    return [UIColor colorWithHue:(hue/360) saturation:saturation brightness:brightness alpha:1.0]; 
} 

+ (UIColor *)aquaColor { 
    return [UIColor colorWithHueDegrees:210 saturation:1.0 brightness:1.0]; 
} 

+ (UIColor *)paleYellowColor { 
    return [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0]; 
} 

@end 

Ahora en código Puedo hacer cosas como:

self.view.backgroundColor = highlight? [UIColor paleYellowColor] : [UIColor whitecolor]; 

y mis propios colores definidos en forma directamente junto a los definidos por el sistema.

(Por cierto, estoy empezando a pensar más en términos de HSB en RGB como Presto más atención a los colores.)

ACTUALIZACIÓN respecto precomputen el valor: Mi corazonada es que no vale la pena. Pero si realmente quisieras, podrías memoize los valores de las variables estáticas:

+ (UIColor *)paleYellowColor { 
    static UIColor *color = nil; 
    if (!color) color = [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0]; 
    return color; 
} 

Se podría hacer una macro hacen los memoizing, también.

+0

me gusta este enfoque. logra la organización que estoy buscando en la definición de uso. No estaba familiarizado con (Extensiones), tendré que leer sobre él, ya que puede ser apropiado para algunas otras clases que estoy usando. Finalmente, (probablemente obteniendo OT), ¿hay utilidades HSB 'selector' como hay recolectores RBG. Me gusta IB, pero me parece útil ver los colores complementarios juntos ya que, con frecuencia, quiero más de un color a la vez. – mobibob

+0

Oh sí, pero un problema que estaba tratando de resolver es obtener el valor precalculado. No quiero realizar tres divisiones cada vez que hago referencia al color. – mobibob

+1

Re selección de color: no soy un experto. Uso el selector de color en Interface Builder. Tiene una rueda de color, controles deslizantes para RGB o HSB, y también una caja de lápices de colores. Me gusta. – jasoncrawford

35

Normalmente suelo hacer una categoría de UIColor para cada proyecto:

@interface UIColor (ProjectName) 

+(UIColor *) colorForSomeTable; 
+(UIColor *) colorForSomeControl; 
+(UIColor *) colorForSomeText; 

@end 

Con las constantes de la aplicación:

@implementation UIColor (ProjectName) 

+(UIColor *) colorForSomeTable { return [UIColor colorWithRed:...]; } 

@end 

También hago lo mismo para UIFont y UIImage según sea necesario.

+4

¡Absolutamente genial! Mi pregunta subsidiaria sería, ¿dónde poner este código? Tengo archivos Constants.h/Constants.m (en mis encabezados precompilados) y simplemente quiero "declarar" un color constante ... No me gusta poner este tipo de código allí ... ¿Dónde lo pondrías? ? –

+0

En mi humilde opinión este es el camino a seguir. –

10

Para ampliar la respuesta de jasoncrawford (lo pondría como un comentario, pero no se puede formatear el código en los comentarios) si desea precalcular los valores (o hacerlo solo una vez).

+ (UIColor *)paleYellowColor 
{ 
    static UIColor* paleYellow = nil; 
    if (paleYellow == nil) 
    { 
     paleYellow = [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0]; 
    } 
    return paleYellow; 
} 

La razón por la que su idea original no funciona es porque el compilador solo puede usar los inicializadores fuera de las funciones, no el código normal. Podrías haber logrado algo como lo que querías con la inicialización methosd, p. Ej.

static UIColor* colorNavBar = nil; 

+(void) initialize 
{ 
    if (colorNavBar != nil) 
    { 
     colorNavBar = .... 
    } 
} 

NB const la clasificación de su definición original es redundante ya UIColor es inmutable de todos modos.

+0

Gracias a todos todos buenos consejos y técnicas. Es probable que siga ese patrón para algunas de mis otras tareas de diseño más específicas de la aplicación. Estoy usando la clase/categorías sugeridas en la primera publicación de Jason. Esto permite una forma elegante de definir una clase de tema de varios colores. – mobibob

+0

.. oh sí, en cuanto a la const en inmutable - ¡sí, lo tengo! Gracias por mencionarlo. – mobibob

8

Usted puede hacer esto:

#define backgroundColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0] 
+1

Evito las soluciones macro cuando hay disponible una alternativa más segura para el tipo de letra o compiladora. Tal vez notes en mi descripción original que reconozco que hay una solución "macro", pero son "feos". La fealdad viene en este caso ya que hay una solución limpia que utiliza la característica de categoría del idioma. – mobibob

11

Puede 'definir' una constante similar como esto:

#define FAV_COLOR [UIColor colorWithRed:24/255.0f green:89/255.0f blue:36/255.0f alpha:0.9] 

y llamarlo por su nombre como usted está acostumbrado con constantes: FAV_COLOR

Espero que ayude.

+0

kasperfn esto es lo mismo que la respuesta de intorpedro (arriba). Prefiero evitar las macros. Mi respuesta favorita es la respuesta de categoría, ya que es un mejor uso de OO del idioma. – mobibob

+0

Usar macros para constantes es algo malo. –

+0

@IulianOnofrei ¿Hay alguna razón específica? ¿Por qué macro malo? ¿Hay algún problema de rendimiento? Por favor, breve. – Ganesh

4
#define textColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0] 

myLabel.textColor=textColorApp; 
+0

Lo sentimos, sigue siendo una solución macro. Prefiero las soluciones de Categoría y extiendo la clase UIColor. – mobibob

5

En Swift: Definir la extensión

extension UIColor { 

    class func XXXWhiteColor() -> UIColor { 
     return UIColor(red: 256, green: 256, blue: 256, alpha: 1.0) 
    } 

    class func XXXGreenColor() -> UIColor { 
     return UIColor(red: 73/255.0, green: 212/255.0, blue: 86/255.0, alpha: 1.0) 
    } 
} 

Uso como: Label.background = UIColor.XXXWhiteColor()

1

apenas define a continuación en el archivo de macro constante y el paso de sólo RGB valor y uso en cualquier lugar que desee

#define RGBCOLOR(r,g,b)[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1] 

de usar:

[lblCount setTextColor:RGBCOLOR(236, 43, 92)]; 
+0

Gracias, pero aún prefiero evitar las macros. Mi respuesta favorita es la respuesta de categoría, ya que es un mejor uso de OO del idioma. – mobibob

0

me siento también vale la pena mencionar otra característica impresionante que rara vez se habló de: Color literales. No solo son más fáciles de leer, sino que son MUCHO MÁS fáciles de editar. En Swift,

let color: UIColor = #colorLiteral(red: 0.9607843137, green: 0.4784313725, blue: 0.3215686275, alpha: 

Cuando se pega en Xcode, esta sintaxis crea un cuadro de color simple. Click here to see an example.

Una vez que vea el cuadro, puede hacer doble clic en él para editarlo fácilmente. Del mismo modo, puede cambiar entre varias opciones de IB, incluido RGB Sliders, si tiene una lista específica de valores hexadecimales de color de su diseñador.

Cuestiones relacionadas