4

私のiPadアプリには、新しいセルが選択されるたびにUIViewサブクラスを割り当て/初期化するUITableViewがあります。この UIView で放射状グラデーションを描画するようにオーバーライドdrawRect:しましたが、正常に動作しますが、パフォーマンスが低下します。セルをタップすると、背景に .png を使用する場合とは対照的に、UIView がプログラムでグラデーションを描画するのにかなりの時間がかかります。メソッドまたはそれが生成する勾配を「キャッシュ」してdrawRect:パフォーマンスを向上させる方法はありますか? drawRect:.png の代わりに使用したいと思います。私の方法は次のようになります。

- (void)drawRect:(CGRect)rect
{
     CGContextRef context = UIGraphicsGetCurrentContext();

     size_t gradLocationsNum = 2;
     CGFloat gradLocations[2] = {0.0f, 1.0f};
     CGFloat gradColors[8] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.5f}; 
     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
     CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradColors, gradLocations, gradLocationsNum);
     CGColorSpaceRelease(colorSpace);

     CGPoint gradCenter = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
     float gradRadius = MIN(self.bounds.size.width , self.bounds.size.height) ;

     CGContextDrawRadialGradient (context, gradient, gradCenter, 0, gradCenter, gradRadius, kCGGradientDrawsAfterEndLocation);

     CGGradientRelease(gradient);
}

ありがとう!

4

1 に答える 1

2

グラフィックをコンテキストにレンダリングし、それをUIImageとして保存できます。この答えはあなたが始めるはずです:

drawRect:UIViewグラフィックオブジェクトを事前に作成するのではなく、ビュー自体を描画するために使用されるメソッドです。

図形を作成して保存し、後で描画したいようですので、として図形を作成し、をUIImage使用して描画するのが妥当と思われますUIImageViewUIImageに直接保存できますNSArray

画像を作成するには、次の手順を実行します(メインキューで、drawRectではありません:)。

1)ビットマップコンテキストを作成します

UIGraphicsBeginImageContextWithOptions(size, opaque, scale);

2)コンテキストを取得する

CGContextRef context = UIGraphicsGetCurrentContext();

3)必要なものを描く

4)コンテキストを画像にエクスポートします

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

5)コンテキストを破棄する

UIGraphicsEndImageContext();

6)画像への参照を保存します

[yourArray addObject:image];

作成する形状ごとに繰り返します。

詳細については、上記の機能のドキュメントを参照してください。drawRect:プログラム内の任意の場所への描画とコンテキストの操作の違いをよりよく理解するには、 Quartz2Dプログラミングガイド、特にグラフィックスコンテキストのセクションを読むことをお勧めします。

于 2012-11-16T20:56:28.703 に答える