現在、2つのUIViewがあります。1つは赤の背景、もう1つは青です。青いビューは赤いビューのサブビューです。私がやりたいのは、赤いビューが見えるように、青いビューで長方形を「切り取る」ことができることです。これをどうやってやるの?
トップビューの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 );
}
}
他のすべての答えには真実がありますが、それは明確な色で描くことはかなり可能です、またはerase任意のパス内の既存の色を言うことです-[UIBezierPath fill]または同様の便利なメソッドを使用しても。必要なことは、次のように、達成しようとしている効果に応じてコンテキストブレンドモードを適切な値に設定することです。
CGContextSetBlendMode(context, kCGBlendModeClear);
[[UIColor clearColor] set];
[myArbitraryPolygonPath fill];
選択できるオプションは約20個あります。 CGContext reference を見てください。
長方形の代わりに楕円を描くには、単に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 );
}
これらは馬鹿げた方法かもしれませんが、私はあなたが説明するようにはしませんが、あなたが望むように見えるようにします。
(ジャックの答えが表示されました-私には良さそうです)
アプローチ1:View Controllerで、露出した「穴」の周りにタイル状に配置される長方形のリストを作成します。穴の数が増えると、タイルの四角形の数も増えます。
アプローチ2:考え方を逆にします。青いビューは背面にあり、赤いビューのセクションがその上に配置されている必要があります。 「ビュー」以外のすべてが青いビューでマスクされた赤いビューがまだ表示されますが、実際に行っているのは、公開したいビューから領域をコピーし、各ホールを作成するときにマスクの上に配置することです。深さをシミュレートする効果がある場合は、必要に応じて各穴に追加できます。
サブクラス化もdrawRect:も必要ありません。