2010-05-04 13 views
0

J'essaye de déboguer un problème qui me bloque vraiment. Fondamentalement, j'ai une sous-classe UIView qui dessine un gradient à lui-même dans drawRect: basé sur les couleurs que je fournis dans la méthode init. Le problème se produit lorsque la vue se dessine à nouveau. Si j'appelle setNeedsDisplay sur la vue, ou si disons que la vue est supprimée à cause d'un avertissement de mémoire insuffisante et qu'elle est rajoutée plus tard (ce qui déclencherait aussi drawRect: again) alors l'arrière-plan de la vue est complètement vide. Je ne suis pas sûr de savoir pourquoi redessiner un dégradé provoquerait cela; Est-ce que quelqu'un sait ce qui pourrait mal se passer? Voici un extrait du code que j'ai en drawRect:Les dégradés de dessin sur un UIView ne fonctionnent pas sur les appels suivants à drawRect:

CGContextRef currentContext = UIGraphicsGetCurrentContext(); 
CGContextSaveGState(currentContext); 
int startcolorNumComponents = CGColorGetNumberOfComponents(self.topColor.CGColor); 
int endcolorNumComponents = CGColorGetNumberOfComponents(self.bottomColor.CGColor); 

// get the array of floats for each of the gradient colors 
const CGFloat *startComponents = CGColorGetComponents(self.topColor.CGColor); 
const CGFloat *endComponents = CGColorGetComponents(self.bottomColor.CGColor); 

CGFloat redStart = startComponents[0]; 
CGFloat greenStart = (startcolorNumComponents != 2)? startComponents[1] : startComponents[0]; 
CGFloat blueStart = (startcolorNumComponents != 2)? startComponents[2] : startComponents[0]; 
CGFloat startAlpha = (startcolorNumComponents != 2)? startComponents[3] : startComponents[1]; 

CGFloat redEnd = endComponents[0]; 
CGFloat greenEnd = (endcolorNumComponents != 2) ? endComponents[1] : endComponents[0]; 
CGFloat blueEnd = (endcolorNumComponents != 2) ? endComponents[2] : endComponents[0]; 
CGFloat endAlpha = (endcolorNumComponents != 2) ? endComponents[3] : endComponents[1]; 

CGFloat components[8] = { redStart, greenStart, blueStart, startAlpha, redEnd, greenEnd, blueEnd, endAlpha }; 

size_t num_locations = 2; 
CGFloat locations[2] = { 0.0, 1.0 }; 

CGGradientRef glossGradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), components, locations, num_locations); 

CGPoint gradientStart = CGPointMake(CGRectGetMidX(self.bounds), self.bounds.origin.x); 
CGPoint gradientEnd = CGPointMake(CGRectGetMidX(self.bounds),self.bounds.size.height)); 

CGContextDrawLinearGradient(currentContext, glossGradient, gradientStart, gradientEnd, 0.0); 
CGGradientRelease(glossGradient); 
CGContextRestoreGState(currentContext); 

Répondre

0

Je pense que cela s'est avéré être un problème de mémoire. Après avoir réparé les fuites de mémoire, cela ne se produit plus pour moi.