CALayer面具 - 结合两层

时间:2012-06-13 14:31:27

标签: ios xcode uiview core-animation calayer

在我的应用程序中,我有一个视图,我希望它在左侧和右侧有一个小的透明渐变。我可以很容易地创建左或右渐变,但我不知道如何组合它们:

CAGradientLayer *rightLayer = [CAGradientLayer layer];
rightLayer.frame = self.bounds;
rightLayer.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor, (id)[UIColor clearColor].CGColor, nil];
rightLayer.startPoint = CGPointMake(0.8f, 1.0f);
rightLayer.endPoint = CGPointMake(1.0f, 1.0f);

CAGradientLayer *leftLayer = [CAGradientLayer layer];
leftLayer.frame = self.bounds;
leftLayer.colors = [NSArray arrayWithObjects:(id)[UIColor clearColor].CGColor,(id)[UIColor whiteColor].CGColor, nil];
leftLayer.startPoint = CGPointMake(0.0f, 1.0f);
leftLayer.endPoint = CGPointMake(0.2f, 1.0f);


self.layer.mask = leftLayer;

正如你所看到的,问题是我必须只为屏幕指定一层,我希望它有2层。我如何合并leftLayer和rightLayer?或者我如何添加这两个图层来掩盖?

非常感谢您的回答!

2 个答案:

答案 0 :(得分:4)

您必须创建一个渐变图层,渐变层从清除变为白色再次清除,并为这三个点设置locations。因此,您必须将endPoint设置为视图的另一侧(覆盖整个宽度),方法是将其设置为1。

您需要将您的点包装在NSValue对象中,以将它们添加到locations数组中,如下所示:[NSValue valueWithCGPoint:myCGPoint];

由于位置定义在0和1之间。您必须根据要屏蔽的图层的宽度计算值。像这样:

0.2/width         // left edge
(width-0.2)/width // right edge

您已经将起点和终点设置在0到1的范围内,所以只需使用相同的值。

答案 1 :(得分:2)

诀窍是使用"位置"正如其他人所说。下面的代码执行"淡出"顶部和底部的渐变 - 如果您希望滚动文本在两端都淡出屏幕,则非常有用。下面的位置应该读作0.0 => 0.1从透明变淡到白色,然后0.9 => 1.0再次从白色淡化到清晰。

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.bounds;
gradient.colors = @[(id)[[UIColor clearColor] CGColor], (id)[[UIColor whiteColor] CGColor], (id)[[UIColor whiteColor] CGColor], (id)[[UIColor clearColor] CGColor]];
gradient.startPoint = CGPointMake(0.5, 0.0);
gradient.endPoint = CGPointMake(0.5, 1.0);
gradient.locations = @[@0.0, @0.1, @0.9, @1.0];

[self.layer setMask:gradient];

请务必在您的文件中加入#import <QuartzCore/QuartzCore.h>