2013-07-17 47 views
0

我願做這樣的使用Quartz一定的效果:如何使用Quartz做聚光燈效果?

enter image description here

我想對ImageView的之上的一層,但一些區域是沒有覆蓋的,我怎麼能實現它?有任何想法嗎?謝謝。

+0

看看這個開源項目https://www.cocoacontrols.com/controls/emhint – Groot

回答

1

目前還不清楚您是在討論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); 
} 

如果你想硬邊,唐對於偏移和陰影都沒有什麼困擾,只需在將混合模式設置爲kCGBlendModeDestinationOut後使用CGContextFillEllipseInRect進行不透明填充。

編輯:它發生在我身上,你也可以做一些類似的徑向漸變效果,但看看你給的效果作爲例子,我猜邊緣更模糊,而不是一個統一的漸變,但這很難說。無論如何,Quartz會爲你提供免費的模糊效果,所以爲什麼不使用它,對嗎?