Quartz を使用して、このような効果を実現したいと思います。
imageView の上にレイヤーを置きたいのですが、カバーされていない領域があります。どうすれば実装できますか? 何か案は?ありがとう。
Quartz を使用して、このような効果を実現したいと思います。
imageView の上にレイヤーを置きたいのですが、カバーされていない領域があります。どうすれば実装できますか? 何か案は?ありがとう。
iOS と MacOS のどちらについて話しているのかは明確ではありませんが、原理は同じです。私が考えることができる最も簡単な方法は、オーバーレイ ビューを半透明の灰色で塗りつぶし、オフセット シャドウでパンチアウトすることです...これは簡単な例です。
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
// Replace with your location, spot radius, and blur radius
CGPoint spotLoc = CGPointMake(200,200);
CGFloat spotRadius = 100;
CGFloat blurRadius = 5;
// Draw 50% black overlay over the entire view
CGContextSetFillColorWithColor(ctx, [[UIColor colorWithRed: 0 green:0 blue:0 alpha:0.5] CGColor]);
CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx));
// Then punch out spot using an offset shadow
CGRect spotRect = CGRectMake(spotLoc.x - spotRadius, spotLoc.y - spotRadius, 2 * spotRadius, 2 * spotRadius);
CGFloat xOffset = CGRectGetMaxX(spotRect) - CGRectGetMinX(self.bounds);
CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut);
CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]);
CGContextSetShadowWithColor(ctx, CGSizeMake(xOffset, 0), blurRadius, [[UIColor blackColor] CGColor]);
CGContextTranslateCTM(ctx, -xOffset, 0);
CGContextFillEllipseInRect(ctx, spotRect);
CGContextRestoreGState(ctx);
}
ハード エッジが必要な場合は、オフセットとシャドウを気にする必要はありません。CGContextFillEllipseInRect
ブレンド モードを に設定した後、不透明な塗りつぶしを使用してくださいkCGBlendModeDestinationOut
。
編集:放射状グラデーション効果でも同様のことができると思いますが、例として与えた効果を見ると、エッジがよりぼやけており、均一なグラデーションではないと推測していますが、言うのは難しいです. いずれにせよ、Quartz はシャドウイング メカニズムを使用して無料でぼかしを提供するので、使用してみませんか?