0

私はこのコードを手に入れました:

CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGFloat colors[] = {
    1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
};
CGGradientRef gradientRef = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors) / (sizeof(colors[0]) * 4));
CGColorSpaceRelease(rgb);
CGContextRef context = UIGraphicsGetCurrentContext();

CGRect rect = theCell.backgroundView.bounds;                
CGPoint start = CGPointMake(rect.origin.x, 0);
CGPoint end = CGPointMake(rect.origin.x, rect.size.height/2);

CGContextDrawLinearGradient(context, gradientRef, start, end, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);

そして、指定されたビューに描画し、クリッピング四角形をパラメーターで関数に渡すにはどうすればよいのだろうか。ヒント: drawRect については気にしません。何もサブクラス化していません。

ヒント 2: 後で削除できないレイヤーを挿入したくありません。

ヒント 3: このコードでは、私の目に見えるものは何も描画されません..... :-( グラフィック ポートがありませんか?

ヒント 4: 背景色を変更するだけで描画を消去したいのですが、完了です...

4

2 に答える 2

2

CGContextRef context = UIGraphicsGetCurrentContext();現在のビューのグラフィック コンテキストを取得するため、UIView の drawRect: メソッドでこれを呼び出すと、描画されます。

私はあなたが何を意味するのか理解できません:

drawRect は気にしません。何もサブクラス化していません。

ただし、カスタム描画を行いたい場合は、drawRect: メソッドをオーバーライドするか、レイヤーを使用する必要があります。レイヤーを使用するには、CGContextRef context = CGLayerGetContext(theLayer);の代わりに呼び出しますCGContextRef context = UIGraphicsGetCurrentContext();

ドキュメントを確認したところ、drawRectMethod から UIGraphicsGetCurrentContext() を呼び出すことで CGContextRef を取得できることがわかりました。内容は次のとおりです。iOS アプリケーションでは、描画する UIView オブジェクトを設定し、drawRect: メソッドを実装して描画を実行します。カスタム drawRect: メソッドを呼び出す前に、ビュー オブジェクトは描画環境を自動的に構成し、コードがすぐに描画を開始できるようにします。この構成の一部として、UIView オブジェクトは、現在の描画環境用のグラフィック コンテキスト (CGContextRef 不透明型) を作成します。このグラフィック コンテキストは、UIKit 関数 UIGraphicsGetCurrentContext を呼び出して取得します。関数 UIGraphicsPushContext および UIGraphicsPopContext を使用して、グラフィックス コンテキストを保存および復元します。

ビュー以外の場所に描画したい状況では、カスタム グラフィックス コンテキスト オブジェクトを作成できます。たとえば、一連の描画コマンドをキャプチャし、それらを使用してイメージまたは PDF ファイルを作成することができます。コンテキストを作成するには、CGBitmapContextCreate または CGPDFContextCreate 関数を使用します。コンテキストを取得したら、コンテンツの作成に必要な描画関数に渡すことができます。

カスタム コンテキストを作成する場合、それらのコンテキストの座標系は、iOS で使用されるネイティブの座標系とは異なります。原点は描画面の左上隅ではなく、左下隅にあり、軸は右上を指します。描画コマンドで指定する座標は、これを考慮に入れる必要があります。そうしないと、結果のイメージまたは PDF ファイルがレンダリング時に正しく表示されない場合があります。CGBitmapContextCreate および CGPDFContextCreate の使用の詳細については、「ビットマップ グラフィック コンテキストの作成」および「PDF グラフィック コンテキストの作成」を参照してください。

于 2011-02-13T00:25:29.480 に答える
0

CAGradientLayer を調べて、ビューのサブレイヤーとして追加することをお勧めしますか? はるかに単純で、テーブルセルにとって重要なのはハードウェアアクセラレーションになります。

ここから部分的に盗まれた例:

http://tumbljack.com/post/188089679/gpu-accelerated-awesomeness-with-cagradientlayer

#import <QuartzCore/QuartzCore.h>  // Also import this framework
......
CAGradientLayer grad = [CAGradientLayer layer];

UIColor *colorOne     = [UIColor colorWithHRed:1.0f Green:1.0f Blue:1.0f alpha:1.0f];
UIColor *colorTwo     = [UIColor colorWithHRed:0.0f Green:0.0f Blue:0.0f alpha:1.0f];

NSArray *colors =  [NSArray arrayWithObjects:(id)colorOne.CGColor, colorTwo.CGColor, nil];
grad.colors = colors;

CGRect rect = theCell.backgroundView.bounds; 
rect.size.height = rect.size.height / 2;
grad.frame = rect;
[self.layer addsublayer:grad]

グラデーションが傾いているかどうかわからないので、色を少しいじる必要があるかもしれません...

于 2011-02-13T01:37:19.453 に答える