7

与えられた:

  1. フレーム付きのCGContextRef(ctx{0,0,100,100}
  2. および長方形(r)、フレーム付き{25,25,50,50}

コンテキストをそのrectにクリップするのは簡単です。

CGContextClipToRect(ctx, r);

下の赤い領域をマスクするには(red == mask)

ここに画像の説明を入力してください

しかし、このクリッピングrectを反転して、クリッピングマスクに変換したいと思います。望ましい結果は、下の赤い部分をマスクすることです(red == mask)

ここに画像の説明を入力してください

これを実行時にプログラムで実行したいと思います。

アプリに静的に出荷するビットマップ画像を手動で準備したくありません。

とを考えるctxr、これを実行時に最も簡単に/簡単に実行するにはどうすればよいですか?

4

4 に答える 4

18

Quartz2Dプログラミングガイドの「FillingaPath」セクションで塗りつぶしルールについてお読みください。

あなたの場合、最も簡単な方法は、偶数奇数の塗りつぶしルールを使用することです。小さな長方形とはるかに大きな長方形で構成されるパスを作成します。

CGContextBeginPath(ctx);
CGContextAddRect(ctx, CGRectMake(25,25,50,50));
CGContextAddRect(ctx, CGRectInfinite);

次に、偶数奇数の塗りつぶしルールを使用して、このパスをクリッピングパスに交差させます。

CGContextEOClip(ctx);
于 2013-01-03T19:42:47.633 に答える
3

CGContextClipToRects()必要な赤いフレームを構成するrectを渡すことで、コンテキストをクリップできます。

于 2013-01-03T19:32:44.657 に答える
1

すべてのペイントを通常どおりに実行してから、次のことを実行できますか?

CGContextClearRect(ctx, r);

すべてが終わった後?

于 2013-01-03T19:29:37.090 に答える
0

これは、robの回答を実装するための便利な拡張機能です

extension UIBezierPath {
    func addClipInverse() {
        let paths = UIBezierPath()
        paths.append(self)
        paths.append(.init(rect: .infinite))
        paths.usesEvenOddFillRule = true
        paths.addClip()
    }
}
于 2021-04-12T03:11:19.580 に答える