6

自分の描画をクリップしたいのですCGContextが、逆に必要です。つまり、を使用してクリッピングパスにいくつかの長方形を追加したいので、クリッピングに追加CGContextAddRect()したすべての長方形と同じ方法でクリッピングを実行する必要があります。パスは、描画操作の影響を受けません。通常、これは逆です。つまり、描画関数は、クリッピングパスに追加された長方形に描画し、クリッピングパスに追加されていない領域は影響を受けません。したがって、必要なのは、を呼び出す前にクリッピングパスを逆にする方法にすぎないと思いCGContextClip()ます。QuickDrawの時代に戻ると、これはリージョンを使用してから呼び出すことで簡単に実行できました。XorRgn()すべての長方形に対して。しかし、クォーツを使用すると、より複雑になるようです。誰かがこれを達成するための簡単な解決策を持っていますか、それとも私は自分でこれらすべてのパス反転計算を行う必要がありますか?

4

2 に答える 2

7

境界全体を長方形として追加してから、描画から除外する長方形を追加して、を使用できますCGContextEOClip

例:

- (void)drawRect:(NSRect)dirtyRect
    CGContextRef ctx = [[NSGraphicsContext currentContext] graphicsPort];
    //Fill the background with gray:
    CGContextSetRGBFillColor(ctx, 0.5, 0.5, 0.5, 1);
    CGContextFillRect(ctx, NSRectToCGRect(self.bounds));
    CGContextAddRect(ctx, NSRectToCGRect(self.bounds));
    //Add some rectangles:
    CGContextAddRect(ctx, CGRectMake(10, 10, 100, 100));
    CGContextAddRect(ctx, CGRectMake(120, 120, 50, 100));
    //Clip:
    CGContextEOClip(ctx);
    //Fill the entire bounds with red:
    CGContextSetRGBFillColor(ctx, 1.0, 0.0, 0.0, 1.0);
    CGContextFillRect(ctx, NSRectToCGRect(self.bounds));
}

赤い長方形を塗りつぶす代わりに、最後に画像を描くと、効果がより明確になります。

于 2012-05-17T16:18:47.563 に答える
2

1つの方法は、ビットマップコンテキストへのクリッピングパスを描画し、結果のビットマップを反転し、を呼び出して元の画像のマスクとして使用することCGContextClipToMask()です。

于 2012-05-17T15:51:57.840 に答える