2011-10-08 41 views
6

Estoy preparando mi aplicación de iPhone para publicar en iOS 5 GM y encontré un error con UIView. Cuando anulo el método drawRect en una subclase, el simulador muestra el resultado deseado, pero cuando intento probarlo en un dispositivo real, la anulación drawRect no tiene ningún efecto.iOS 5 UIView drawRect override no funciona en el dispositivo

Incluso coloque una declaración de registro dentro de una anulación drawRect y confirmó que se está llamando.

¿Alguien más ha notado este problema?

Aquí hay un código de anulación que estoy usando:

- (void)drawRect:(CGRect)rect { 
DebugLog(@"*** calling drawRect ***"); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

// draw the dark gray background 
CGContextSetFillColor(context, [SkinManager getWhiteColor]); 
CGContextFillRect(context, CGRectMake(0.0, 0.0, rect.size.width, rect.size.height)); 

// draw the text field background in white 
CGContextSetFillColor(context, [SkinManager getDarkGray]); 
CGContextFillRect(context, CGRectMake(2.0, 2.0, rect.size.width - 4, rect.size.height - 4)); 

}

Aquí está el código para generar el color

+(const CGFloat*) getDarkGray { 
     UIColor *color = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1]; 

     return [self getCGColor:color]; 
} 

+(const CGFloat*) getCGColor: (UIColor*)color { 
     CGColorRef colorref = [color CGColor]; 

     const CGFloat *components = CGColorGetComponents(colorref); 

     return components; 
} 

Una vez más, este código funciona perfectamente en iOS 4.xy en el simulador para iOS 5. El único lugar que se rompe es el dispositivo iOS 5.

+0

Publique su código, es más probable que exista un problema allí que en iOS, ya que es muy básico que otros lo hayan encontrado también si realmente hay un error (nuestra empresa tiene varias aplicaciones iOS y no hemos visto cualquier problema en esta área). – DarkDust

+1

Además, iOS 5 aún está bajo NDA, por lo que es posible que desee ir al Dev-Forum. – Phlibbo

+0

Hice una pregunta en el foro de desarrollo, pero hasta ahora nadie tiene ninguna respuesta. – Jay

Respuesta

0

En lugar de usar rect en su código, intente usar self.bounds. Rect es el área que necesita refrescarse, no toda el área de su vista.

+0

He intentado usar self.bounds y no hizo ninguna diferencia. – Jay

+1

¿Estás seguro de que drawRect está en una subclase y no en una categoría? Anular categorías no siempre funciona en todas las versiones de iOS. – EricS

+0

Sí, es una subclase. En realidad es una subclase de una subclase. Estoy bastante seguro de que esto es un error ya que el simulador funciona correctamente. – Jay

0

en iOS 5 drawRect: no está en algunos objetos, p. UINavigationBar. En estas circunstancias, debe utilizar de forma condicional los nuevos métodos de diseño de iOS 5.

This pregunta y this pregunta podría ser útil para usted.

+1

No es cierto; simplemente dice que no se llamará a menos que estés en una subclase. Y el OP se refiere a un 'UIView', no a ninguna de las vistas a las que esto se aplica. – FeifanZ

2

Uso [self setNeedsDisplay];

El método drawRect sólo se llama a init, por lo que puede pasar que si su objeto fue inited previamente y que necesita para "refrescar" la misma.

Cuestiones relacionadas