web-dev-qa-db-ja.com

iPhone-UIViewに透明な長方形を描画して、下のビューを表示します

現在、2つのUIViewがあります。1つは赤の背景、もう1つは青です。青いビューは赤いビューのサブビューです。私がやりたいのは、赤いビューが見えるように、青いビューで長方形を「切り取る」ことができることです。これをどうやってやるの?

38
Dave

トップビューのdrawRectメソッドをオーバーライドする必要があります。そのため、たとえば、HoleyViewから派生するUIViewクラスを作成できます(プロジェクトに新しいファイルを追加し、Objective-Cサブクラスを選択し、[サブクラスのサブクラス「UIView」に。 HoleyViewでは、drawRectは次のようになります。

- (void)drawRect:(CGRect)rect {
    // Start by filling the area with the blue color
    [[UIColor blueColor] setFill];
    UIRectFill( rect );

    // Assume that there's an ivar somewhere called holeRect of type CGRect
    // We could just fill holeRect, but it's more efficient to only fill the
    // area we're being asked to draw.
    CGRect holeRectIntersection = CGRectIntersection( holeRect, rect );

    [[UIColor clearColor] setFill];
    UIRectFill( holeRectIntersection );
}

Interface Builderを使用している場合は、holeyビューのクラスをHoleyViewに変更してください。これを行うには、Interface Builderのビューで選択し、インスペクターの「ID」ペイン(右端の「i」アイコン)を選択します。

また、次のコードスニペットを使用するか、Interface BuilderでビューのプロパティのOpaqueチェックボックスをオフにして、トップビューを不透明でないように設定する必要があります(Viewセクションにあります)ビューの属性の)、背景色の不透明度を0%に設定します(背景色は同じセクションで設定されます)。

topView.opaque = NO;
topView.backgroundColor = [UIColor clearColor];

サークルをしたい場合は、Core Graphics(別名Quartz 2D)。 こちら にあるプログラミングガイドをお読みください。

長方形の代わりに楕円を描くには、drawRectは次のようになります。

- (void)drawRect:(CGRect)rect {
    // Get the current graphics context
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor( context, [UIColor blueColor].CGColor );
    CGContextFillRect( context, rect );

    if( CGRectIntersectsRect( holeRect, rect ) )
    {
        CGContextSetFillColorWithColor( context, [UIColor clearColor].CGColor );
        CGContextFillEllipseInRect( context, holeRect );
    }
}
75
Jacques

他のすべての答えには真実がありますが、それは明確な色で描くことはかなり可能です、またはerase任意のパス内の既存の色を言うことです-[UIBezierPath fill]または同様の便利なメソッドを使用しても。必要なことは、次のように、達成しようとしている効果に応じてコンテキストブレンドモードを適切な値に設定することです。

CGContextSetBlendMode(context, kCGBlendModeClear);
[[UIColor clearColor] set];
[myArbitraryPolygonPath fill];

選択できるオプションは約20個あります。 CGContext reference を見てください。

35
rage

長方形の代わりに楕円を描くには、単にblendModeをクリアに設定します:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor( context, [UIColor blackColor].CGColor );
    CGContextFillRect( context, rect );

    CGRect holeRectIntersection = CGRectIntersection( holeRect, rect );

    CGContextSetFillColorWithColor( context, [UIColor clearColor].CGColor );
    CGContextSetBlendMode(context, kCGBlendModeClear);

    CGContextFillEllipseInRect( context, holeRect );
}
17
valvoline

これらは馬鹿げた方法かもしれませんが、私はあなたが説明するようにはしませんが、あなたが望むように見えるようにします。

(ジャックの答えが表示されました-私には良さそうです)

アプローチ1:View Controllerで、露出した「穴」の周りにタイル状に配置される長方形のリストを作成します。穴の数が増えると、タイルの四角形の数も増えます。

アプローチ2:考え方を逆にします。青いビューは背面にあり、赤いビューのセクションがその上に配置されている必要があります。 「ビュー」以外のすべてが青いビューでマスクされた赤いビューがまだ表示されますが、実際に行っているのは、公開したいビューから領域をコピーし、各ホールを作成するときにマスクの上に配置することです。深さをシミュレートする効果がある場合は、必要に応じて各穴に追加できます。

サブクラス化もdrawRect:も必要ありません。

1
Adam Eberbach