圆形CAGradientLayer面具

时间:2013-04-16 17:39:26

标签: ios objective-c uiview calayer quartz-core

我有一个UIView,使用UIBezierPath以编程方式绘制“sunburst”模式。现在我想通过用渐变掩盖边缘来扩展它 - 有效地使每个“爆发”从不透明变为透明。我认为这可以通过CAGradientLayer面具来完成,但我不确定如何使它循环。

这就是我正在尝试的 - 它会遮挡视图,但渐变是线性的:

    CAGradientLayer *l = [CAGradientLayer layer];
    l.frame = CGRectMake(0.0f, 0.0f, rect.size.width, rect.size.height);
    l.cornerRadius = rect.size.width/2.0f;
    l.masksToBounds = YES;
    l.colors = [NSArray arrayWithObjects:(id)[UIColor blackColor].CGColor, (id)[UIColor clearColor].CGColor, nil];
    self.layer.mask = l;

如果有人知道使用边缘模糊的圆圈屏蔽视图的任何其他方法,我愿意不使用CAGradientLayer

由于matt的洞察力,我最终使用CGContextDrawRadialGradient绘制了一个蒙版视图,将其渲染为UIImage,并将其用作遮罩层。如果有人对此过程感兴趣,则会在this test project.

中使用它

3 个答案:

答案 0 :(得分:1)

一种显而易见的方法是手动绘制此效果。开始时非常小,并且越来越大,并且(同时)越来越不透明。

另一方面,制作径向渐变并将其用作遮罩(晕影效果)可能就足够了。 Core Graphics将为您绘制径向渐变:

https://developer.apple.com/library/ios/#documentation/graphicsimaging/reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextDrawRadialGradient

我也非常喜欢CIFilters添加这样的功能:你应该查看目录,看看你喜欢什么:

https://developer.apple.com/library/ios/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html

CIFilter实际上给你你可能适合你的目的的旭日过渡,特别是如果与掩蔽和合成相结合;这里是关于森伯斯特(用于动画)的讨论,来自我的书:

http://www.apeth.com/iOSBook/ch17.html#_cifilter_transitions

答案 1 :(得分:0)

CAGradientLayer绘制线性渐变。

您可以尝试设置阴影,看看是否符合您的需求:

l.shadowColor = [UIColor blackColor];
l.shadowRadius = rect.size.width / 2;

答案 2 :(得分:0)

您可以通过创建CALayer实例并为其提供实现drawLayer:inContext的委托来实现此目的:并在该方法的实现中绘制径向渐变。然后使用CALayer作为你的面具。

相关问题