クリッピング パスでこれを行うことができます。EO スタッフは、すべてが描画される外部空間と何も描画されない内部空間を定義するために必要です。
後で明るい色の赤い円を入れているので、これを少し複雑にしました。
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx); // store to ignore the clipping path later
float margin = self.bounds.size.width * .1;
CGRect ellipseRect = CGRectMake(margin, margin, self.bounds.size.width - 2*margin, self.bounds.size.height - 2*margin);
// OUTER path is just the bounds
CGMutablePathRef mutablePath = CGPathCreateMutable();
CGPathRef pathRef = CGPathCreateWithRect(self.bounds, NULL);
CGPathAddPath(mutablePath, NULL, pathRef);
// INNER path is the same as the ellipse
CGPathRef pathRef2 = CGPathCreateWithEllipseInRect(ellipseRect, NULL);
CGPathAddPath(mutablePath, NULL, pathRef2);
CGContextAddPath(ctx, mutablePath);
CGContextEOClip(ctx);
CGContextSetFillColorWithColor(ctx, UIColor.greenColor.CGColor);
CGContextSetShadowWithColor(ctx, CGSizeMake(margin/2.0f, margin/2.0f), 10, UIColor.blackColor.CGColor);
CGContextFillEllipseInRect(ctx, ellipseRect);
// replace the green circle for a very transparent red one just for fun
CGContextRestoreGState(ctx);
CGContextSetFillColorWithColor(ctx, [UIColor.redColor colorWithAlphaComponent:.1].CGColor);
CGContextSetShadowWithColor(ctx, CGSizeZero, 0, NULL);
CGContextFillEllipseInRect(ctx, ellipseRect);
}