2010-05-04 2 views
0

Я пытаюсь отладить проблему, которая действительно меня колотит. В принципе, у меня есть подкласс UIView, который рисует градиент для себя в drawRect: на основе цветов, которые я предоставляю в методе init. Проблема возникает, когда представление снова рисует. Если я вызываю setNeedsDisplay в представлении или если говорят, что представление удалено из-за предупреждения из памяти, и оно будет добавлено позже (что также вызовет drawRect: снова), то фон представления будет полностью пустым. Я не уверен, почему перерисовка градиента вызовет это; кто-нибудь знает, что может пойти не так? Вот выдержка из кода, который у меня есть в drawRect:Градиенты рисования на UIView не работают при последующих вызовах 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); 

ответ

0

Я думаю, что это оказалось проблемой памяти. После исправления утечек памяти это больше не происходит для меня.

Смежные вопросы