0

本当に困惑している問題をデバッグしようとしています。基本的に、私は drawRect でそれ自体にグラデーションを描画する UIView サブクラスを持っています: 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);
4

1 に答える 1

0

これはメモリの問題であることが判明したと思います。メモリリークを修正した後、これはもう起こりません。

于 2010-07-06T22:33:54.140 に答える