CALayer no representa el color de background en los dispositivos, funciona en un simulador

He creado un button personalizado fuera de las capas. Creo un montón de capas en init . Todo funciona como se espera hasta que vaya a modificarlos *. Es solo en los dispositivos reales donde se produce el problema, en el simulador el código funciona como se esperaba.

He intentado forzar las capas para renderizar estableciendo needsDisplay y needsLayout to YES .

 -(void) setBackgroundColor:(UIColor *)backgroundColor { //return; // if I return here, the button gets initialized with it's default royal blue color. This works correctly on the simulator and device [primaryBackground setColors: [NSArray arrayWithObject:(id)backgroundColor.CGColor]]; //return; //if I return here, primaryBackground will display a clear background on the device, but will display CGColor on the simulator. CALayer* ll = [CALayer layer]; ll.frame=self.frame; ll.cornerRadius=primaryBackground.cornerRadius; [ll setBackgroundColor:backgroundColor.CGColor]; [primaryBackground addSublayer:ll]; //if I return here, primaryBackground will display the "expected" results on both platforms. IE: it dispalys the new layer, but not it's background color. } 

SIMULADOR

captura de pantalla del simulador

DISPOSITIVO

captura de pantalla del dispositivo

PRUEBAS

He probado en iOS 5.1 y 4.2 con los mismos resultados. Parece que funciona igual en los simuladores versión 4.1, 4.2 y 5.1

Veo al less 2 problemas con su código:

  1. Está agregando una nueva capa cada vez que se cambia el color, sin quitar el anterior. Primero, quite la subcapa creada previamente (o simplemente cambie su color sin crear y agregar una nueva). Recuerde que la propiedad opaque pnetworkingeterminada de CALayer se establece en NO , lo que significa que se está mezclando con todas las demás subcapas.

    ¿Por qué agregar otra subcapa de todos modos? En su código, cubre primaryBackground completo. Can not setBackgroundColor: function se ve así:

     - (void)setBackgroundColor:(UIColor *)backgroundColor { [primaryBackground setBackgroundColor:backgroundColor.CGColor]; } 

    ?

  2. Pero si realmente debe tener una capa adicional, debe establecer el frame ll en los bounds de la superlayer (no en el frame ). Debería ser ll.frame = self.bounds . También debe anular el método - (void)layoutSubivews y establecer - (void)layoutSubivews el frame de la capa de background en los límites de la capa raíz.

Recuerde que, en iPhone Simulator , las cosas se representan por diferentes subsistemas y mucho más rápido que en dispositivos reales. Y algunos cálculos de marco pueden superponerse, etc.