2010-09-18 13 views
8

Tengo un UIView que está configurado en opaque = NO y todo funciona bien. En el drawRect que estoy haciendo dibujo personalizado, y esto funcionaSolo el color de relleno blanco es transparente en UIView

CGContextSetFillColor(context, CGColorGetComponents([UIColor blueColor].CGColor)); 
CGContextFillRect(context, labelOutside); 
CGContextAddRect(context, labelOutside); 

pero esta

CGContextSetFillColor(context, CGColorGetComponents([UIColor whiteColor].CGColor)); 
CGContextFillRect(context, labelOutside); 
CGContextAddRect(context, labelOutside); 

resultados en Sin relleno que se produce (incluso se puede ver otras cosas que dibujé en el CGContext a través de él) ¿Cómo puedo dibujar un relleno blanco?

Nota: Si establezco que el control no sea opaco, todavía no funciona.

Respuesta

17

¿Por qué no utilizar CGContextSetFillColorWithColor? Luego puede pasar el objeto CGColor directamente en lugar de extraer sus componentes y asumir que está en el mismo espacio de color que el contexto.

Editado para agregar:

esto funciona

CGContextSetFillColor(context, CGColorGetComponents([UIColor blueColor].CGColor)); 

pero esta

CGContextSetFillColor(context, CGColorGetComponents([UIColor whiteColor].CGColor)); 

resultados en Sin relleno que se producen (incluso se puede ver otras cosas que dibujé en el CGContext a través de él).

Como mencioné, esta forma de configurar el color de relleno supone que el color está en el mismo espacio de color que el contexto.

Normalmente, la mayoría de los CGContexts están en un espacio de color RGB. whiteColor, por otro lado, es casi seguro en un espacio de color blanco, que tiene solo uno o dos componentes (blanco y alfa).

Por lo tanto, dado que el contexto está en un espacio de color RGB, CGContextSetFillColor espera que pasen tres o cuatro componentes (rojo, verde, azul y alfa). Cuando obtiene los componentes del CGColor whiteColor, obtiene un puntero a una matriz C que contiene solo dos componentes. CGContextSetFillColor leerá los tres o cuatro componentes que quiera sin importar qué; si pasa menos, puede encontrar basura después de ellos, o puede encontrar ceros.

Si encuentra un cero en la posición alfa, el resultado es que ha establecido el color de relleno entre amarillo (rojo = 1.0, verde = 1.0, azul = 0.0) y blanco (los tres = 1.0) con cero alfa Eso es lo que hace que el relleno no se muestre: se está llenando con un color transparente.

El problema es que hay una falta de coincidencia entre el espacio de color en el que se encuentra el contexto (con tres o cuatro componentes) y el espacio de color en el que está el color (con uno o dos componentes). La solución es eliminar la falta de coincidencia, que es lo que CGContextSetFillColorWithColor hace: Dado que está pasando todo el objeto CGColor, no solo una matriz de números, Core Graphics podrá establecer el espacio de color del contexto al del objeto de color e interpretar el los componentes del objeto de color correctamente.

+2

¡Impresionante, gracias! 'CGContextSetFillColorWithColor (context, [UIColor whiteColor] .CGColor);' –

+0

gran explicación gracias –

+0

Gran explicación, muy útil. – CVertex

Cuestiones relacionadas