0

ビューを作成し、draw rect メソッドで、ユーザーがスライダーで何をするかに応じてパスを作成します。標準色を使用すると、すべてが機能し、非常に見栄えがします。このリンクでパターンを四角形に描画する方法を示すアップルのコードスニペットに従おうとしています: Apple Drawing Guide

この例は、目的のパターンを使用して関数コールバックを作成し、次に rect を描画する追加のメソッド呼び出しを作成する方法を示しています。rect から記述されたコードを呼び出すと、期待どおりにパターンが描画されますが、 rect を塗りつぶしたくありません。指定されたパスを rect に塗りつぶしたいと考えています。描画メソッドの呼び出しを CGContextFillRect から CGContextFillPath に変更すると、機能しません。このコードを変更して、私がやりたいことを実行できるようにするために見落としているものがあると確信しています。

私のコールバック パターンは単純なチェッカーボードです。

コード:

// Call Back function for Graphics Pattern

#define PATTERN_SIZE 10

void patternSpec(void *info , CGContextRef pContext){

    NSLog(@"patternSpec Callback Called");
    CGFloat subUnit = PATTERN_SIZE / 2;

    CGRect square1 = {{0,0}, {subUnit, subUnit}},
    square2 = {{subUnit, subUnit}, {subUnit, subUnit}},
    square3 = {{0 , subUnit}, {subUnit, subUnit}},
    square4 = {{subUnit , 0}, {subUnit, subUnit}};


    CGContextSetRGBFillColor(pContext, 1.0, 0.0, 0.0, 1.0 );
    CGContextFillRect(pContext, square1);

    CGContextSetRGBFillColor(pContext, 1.0, 0.0, 0.0, 1.0 );
    CGContextFillRect(pContext, square2);

    CGContextSetRGBFillColor(pContext, 0.0, 0.0, 0.0, 1.0 );
    CGContextFillRect(pContext, square3);

    CGContextSetRGBFillColor(pContext, 0.0, 0.0, 0.0, 1.0 );
    CGContextFillRect(pContext, square4);

}

// Method that draws the pattern

static void drawPattern (CGContextRef myContext)
{
    NSLog(@"drawPattern Called ");
    CGPatternRef    pattern;
    CGColorSpaceRef patternSpace;
    CGFloat         alpha = 1.0;
    //width, height;

    static const CGPatternCallbacks callbacks = {0, &patternSpec, NULL};

    CGContextSaveGState (myContext);
    patternSpace = CGColorSpaceCreatePattern (NULL);// 6
    CGContextSetFillColorSpace (myContext, patternSpace);// 7
    CGColorSpaceRelease (patternSpace);// 8

    pattern = CGPatternCreate (NULL,CGRectMake (0, 0, PATTERN_SIZE, PATTERN_SIZE),
    CGAffineTransformIdentity, PATTERN_SIZE, PATTERN_SIZE,
    kCGPatternTilingConstantSpacing true, &callbacks);

    CGContextSetFillPattern (myContext, pattern, &alpha);// 17
    CGPatternRelease (pattern);// 18
    //CGContextFillRect(myContext, rect);
    CGContextDrawPath(myContext, kCGPathFill);
    CGContextRestoreGState (myContext);

}

ルーチンを呼び出したいコードのスニペットを次に示します。

CGContextSetLineWidth(context, .7);
CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);


// Standard non-inverted view scenario.
CGContextBeginPath(context);

CGContextMoveToPoint(context, 0.00 , bMargin);      
CGContextAddLineToPoint(context, highPX - curveSP , bMargin);
[self addCurve:context startX:highPX startY:bMargin radius:bo curveSp:curveSP curveDir:FL_BL];

CGContextAddLineToPoint(context, highPX, ((h - tMargin) - curveSP) );
[self addCurve:context startX:highPX startY: (h - tMargin) radius:bo curveSp:curveSP curveDir:FL_TL];


CGContextAddLineToPoint(context, (lowPX - curveSP), (h - tMargin) );
[self addCurve:context startX: lowPX  startY: (h - tMargin) radius:bo curveSp:curveSP curveDir:FL_TR];

CGContextAddLineToPoint(context, lowPX, (bMargin + curveSP) );      
[self addCurve:context startX:lowPX startY: bMargin  radius:bo curveSp:curveSP curveDir:FL_BR];

CGContextAddLineToPoint(context, w, bMargin);

//CGContextDrawPath(context, nonInvertedView);

CGContextDrawPath(context, kCGPathStroke);
// fill with pattern
drawPattern(context);

実際のリンゴの例では、描画メソッドに NSRect 引数も含まれていますが、四角形を塗りつぶしたくないので、省略できると考えました。よくわかりませんが。

ありがとう

4

2 に答える 2

0

更新があります: 何が起こっているのか完全には理解できませんが、drawPattern メソッドのコードを空の四角形を持つテスト アプリにドロップすると、本来のように描画されます。ビューにパスを描画するメソッドにコードをドロップすると、非常に奇妙な動作が発生します。認識すべきではないView Controllerの一部を再描画しようとさえします。

CGContextSaveGState()、CGColorSpaceRelease()、CGPatternRelease()、および CGContextRestoreGState() を削除するとすぐに、コードはまさに私が望んでいたことを実行し始めました。メソッドを次のように変更しました。

static void drawPattern(CGContextRef *pContext){

    static CGPatternRef    pattern;
    static CGColorSpaceRef patternSpace;
    static CGFloat         alpha = 1.0;


static const CGPatternCallbacks callbacks = {0, &patternSpec, NULL};

    patternSpace = CGColorSpaceCreatePattern (NULL);
    CGContextSetFillColorSpace (pContext, patternSpace);

    pattern = CGPatternCreate (NULL, 
               CGRectMake (0, 0, PATTERN_SIZE, PATTERN_SIZE),
               CGAffineTransformIdentity,
               PATTERN_SIZE, 
               PATTERN_SIZE, 
               kCGPatternTilingConstantSpacing,
               true, &callbacks);


     CGContextSetFillPattern (pContext, pattern, &alpha);   

}

これで、定義済みのパターンを呼び出すか、定義済みの塗りつぶしの色を設定できます。

CGContextSetFillColor(context);
or:    
drawPattern(context);

これらの saveState または Release メソッドの一部を除外することがメモリ リークなどの問題であるかどうかを知りたいので、これについて意見をいただければ幸いです。

ありがとう

于 2013-04-29T16:41:16.010 に答える