繁体   English   中英

圆形CAGradientLayer遮罩

[英]Circular CAGradientLayer Mask

我有一个UIView ,可以使用UIBezierPath以编程方式绘制“ 森伯斯特 ”模式。 现在,我想通过使用渐变遮盖边缘来扩展此范围-有效地使每个“爆发”从不透明变为透明。 我认为可以使用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 ,并将其用作遮罩层。 如果有人对此过程感兴趣,那么它将在本测试项目中使用。

一种明显的方法是手动绘制此效果。 从很小的地方开始,画越来越大的朝阳,(同时)越来越不透明。

另一方面,进行径向渐变并将其用作遮罩(渐晕效果)可能就足够了。 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

CAGradientLayer绘制线性渐变。

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

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

您可以通过创建CALayer实例并为它提供一个实现drawLayer:inContext:的委托并在该方法的实现中绘制径向渐变的方式来实现。 然后使用该CALayer作为您的遮罩。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM