2010-12-03 15 views
1

私は3.2以降のiPadアプリを作成しています。私のアプリには半透明のオーバーレイビューがあり、その下のすべてが暗くなります。このビューの途中で、私はこのコードで、無傷介してバックグラウンドフィルタの一部をできるように、この半透明に穴をチョッピングしています:親ビューから角を丸めたUIViewを削除するにはどうすればよいですか?

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGRect intersection = CGRectIntersection(hole.frame, rect); 
    CGContextClearRect(context, intersection); 
} 

また、「穴」ビューが丸められたコーナーを介して印加します:これは一つの小さな問題を除いて素晴らしい作品

self.layer.cornerRadius = 4.25; 

- これらの丸みを帯びた角を考慮し、そのうちのみじん切ります穴ではなく丸いの正方形の四隅を持っていません。私はこれを修正する必要がありますが、私はどのように考えていない。どのようなアイデア、例、考え?

答えて

3

ここで私はそれが動作するようになってしまった方法です。これは、 'ホール' UIViewと同じフレームを持つ穴を生成し、それを自己(UIView)から切り取ります。これにより、妨げられない「穴」の後ろにあるものを見ることができます。

- (void)drawRect:(CGRect)rect { 
    CGFloat radius = self.hole.layer.cornerRadius; 
    CGRect c = self.hole.frame; 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

     // this simply draws a path the same shape as the 'hole' view 
    CGContextMoveToPoint(context, c.origin.x, c.origin.y + radius); 
    CGContextAddLineToPoint(context, c.origin.x, c.origin.y + c.size.height - radius); 
    CGContextAddArc(context, c.origin.x + radius, c.origin.y + c.size.height - radius, radius, M_PI_4, M_PI_2, 1); 
    CGContextAddLineToPoint(context, c.origin.x + c.size.width - radius, c.origin.y + c.size.height); 
    CGContextAddArc(context, c.origin.x + c.size.width - radius, c.origin.y + c.size.height - radius, radius, M_PI_2, 0.0f, 1); 
    CGContextAddLineToPoint(context, c.origin.x + c.size.width, c.origin.y + radius); 
    CGContextAddArc(context, c.origin.x + c.size.width - radius, c.origin.y + radius, radius, 0.0f, -M_PI_2, 1); 
    CGContextAddLineToPoint(context, c.origin.x + radius, c.origin.y); 
    CGContextAddArc(context, c.origin.x + radius, c.origin.y + radius, radius, -M_PI_2, M_PI, 1); 

     // finish 
    CGContextClosePath(context); 
    CGContextClip(context); // this is the secret sauce 
    CGContextClearRect(context, c); 
} 
0

レイヤーのプロパティを変更する場合は、コンテンツを丸みのある角にクリップするために、関連付けられたビューでclipsToBoundsYESを設定する必要があります。

+0

clipsToBoundsは、受信者ビューの範囲外にオブジェクトを描画するかどうかを指定します。言い換えれば、親UIViewの範囲外のUIViewのサブビューを描画することができます。それがここでどのように役立つのか分かりません。 – Allyn

+0

'cornerRadius'は(大まかに)クリッピングパスに組み込まれているので、あなたのコンテンツにクリッピングが有効になるようにする必要があります。 –

+0

私はこれを試しただけで、コーナーを修正するようには見えません。 – Allyn

1

あなたがやっていることは、マスキングと呼ばれています。 Core Graphicsを使用して、現在のグラフィックスコンテキストをマスクすることができます。ここでは、件名に、Appleのドキュメントを参照してください:

http://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html#//apple_ref/doc/uid/TP30001066-CH212-CJBHDDBE

+0

画像を参照するように見える - 私はビューをマスクする必要があります。操作を行うためにビューをイメージにレンダリングするのが適切ですか? – Allyn

+0

間違いなく。ここに投稿したコードを変更すると、そうすることができます:http://stackoverflow.com/questions/4168484/exporting-customized-uitableviewcells-into-uimage/4169320#4169320 – Ryan

関連する問題