ここで私はそれが動作するようになってしまった方法です。これは、 'ホール' 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);
}
clipsToBoundsは、受信者ビューの範囲外にオブジェクトを描画するかどうかを指定します。言い換えれば、親UIViewの範囲外のUIViewのサブビューを描画することができます。それがここでどのように役立つのか分かりません。 – Allyn
'cornerRadius'は(大まかに)クリッピングパスに組み込まれているので、あなたのコンテンツにクリッピングが有効になるようにする必要があります。 –
私はこれを試しただけで、コーナーを修正するようには見えません。 – Allyn