4

関数の CGContext グループのラッパー クラスを作成した人はいますか?

昨日、単純なメモリ管理のために CGGradient 機能のサブセットをカプセル化した単純な Gradient クラスを作成しました。それはかなり簡単でした。しかし、CGContext 操作は他にもかなり多くあることは明らかです。

基本的に私が探しているのは、次のようなものです...

@interface CGContext : NSObject
{
    CGContextRef context;
}

+ (CGContext *) bitmapContextWithData:(void *)data
                                width:(size_t)width
                               height:(size_t)height
                     bitsPerComponent:(size_t)bitsPerComponent
                          bytesPerRow:(size_t)bytesPerRow
                           colorspace:(CGColorSpaceRef)colorspace
                           bitmapInfo:(CGBitmapInfo)bitmapInfo;

- (void) saveGState;
- (void) restoreGState;

- (void) setBlendMode:(CGBlendMode)mode;

- (void) addLineToPoint:(CGPoint)point;
- (void) addLineToPointX:(CGFloat)x pointY:(CGFloat)y;

- (void) drawImage:(CGImageRef)image rect:(CGRect)rect;

- (void) concatCTM:(CGAffineTransform)transform;
- (CGAffineTransform) getCTM;

@end

など。

(私は描画の 99% を画面外のビットマップに行っているため、この場合はメモリ管理に注意を払っています。アクティブ スクリーンなどの現在の UI グラフィックス コンテキストに常に描画していた場合、ラッパー クラスが非常に役立ちます。)

4

1 に答える 1

2

ドキュメントによると、 UIBezierPathクラスは、 「 CoreGraphicsフレームワークのパス関連機能のObjective-Cラッパーです...[それは]実際にはCGPathRefデータ型とそれに関連する描画属性の単なるラッパーです。道。" 「iOS用の描画と印刷ガイド」には、このクラスの説明といくつかの優れた図があります。(そのいとこNSBezierPathおよびCGPathRefも参照してください。)

CGContext自体のラッパーについては...更新:...独自の概念実証ラッパーを作成した後、 MarcelWeiherによるMPWDrawingContextを発見しました。便利なメソッドがたくさん追加され、チェーンもサポートされます。


Rubyスクリプトを作成して、 CGCanvasと呼ばれるCGContextのラッパークラスを生成しました。

まだあまり役に立ちませんが、その概念を証明しています。APIはまだ面倒な機能を果たしていますが、パラメーター名を表示できるのが好きです。

前:

CGContextFillEllipseInRect(context, CGRectMake(30.0, 210.0, 60.0, 60.0));
CGContextAddArc(context, 150.0, 60.0, 30.0, 0.0, M_PI/2.0, false);
CGContextStrokePath(context);
CGContextAddArc(context, 150.0, 60.0, 30.0, 3.0*M_PI/2.0, M_PI, true);
CGContextStrokePath(context);

後:

[canvas fillEllipseInRect:CGRectMake(30.0, 210.0, 60.0, 60.0)];
[canvas addArc_x:150.0 y:60.0 radius:30.0 startAngle:0.0 endAngle:M_PI/2.0 clockwise:false];
[canvas strokePath];
[canvas addArc_x:150.0 y:60.0 radius:30.0 startAngle:3.0*M_PI/2.0 endAngle:M_PI clockwise:true];
[canvas strokePath];

名前を意味のあるものにするためにいくつかのトリックを行いました...たとえば、複数のパラメーターを持つ関数名は、ベース名に追加された最初のパラメーターの名前を取得します(すでにそれで終わっている場合を除く)。ココアのような「with」の代わりにアンダースコアを使用して、ベース名をパラメーター名から分離しました。たとえば、またはmoveToPoint_x:y:の代わりに使用しました。moveToPointWithX:y:moveToPoint:y:

このクラスを使い続ける場合は、コンストラクターを追加し、ブロックメソッド(この人が行ったように)を追加して、パスを一度に開始、構築、およびストロークできるようにします。また、多くの名前はさらに短くなる可能性があり、多くのメソッドはいくつかのデフォルトを使用する可能性があります。

そして多分メソッドチェーン!Objective-Cだけがそれほどブラケットに夢中でなかったら。次のようになります。

[[[[[[[[canvas
  setRGBStrokeColor_red: 1.0 green: 1.0 blue: 1.0 alpha: 1.0]
  setRGBFillColor_red:0.0 green:0.0 blue:1.0 alpha:1.0]
  setLineWidth:2.0]
  fillEllipseInRect:CGRectMake(30.0, 210.0, 60.0, 60.0)]
  addArc_x:150.0 y:60.0 radius:30.0 startAngle:0.0 endAngle:M_PI/2.0 clockwise:false]
  strokePath]
  addArc_x:150.0 y:60.0 radius:30.0 startAngle:3.0*M_PI/2.0 endAngle:M_PI clockwise:true]
  strokePath];

(これはそれほどひどいことではないと思います...)

于 2013-03-07T19:03:51.130 に答える