Рисование градиентов в UIView не работает при последующих вызовах drawRect: - PullRequest
0 голосов
/ 04 мая 2010

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

1 Ответ

0 голосов
/ 07 июля 2010

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

...