Objective c 目标二维梯度
我需要在2D梯度上做。我让它的第一部分从一种颜色到一种清晰的颜色做一个垂直方向的渐变:Objective c 目标二维梯度,objective-c,gradient,Objective C,Gradient,我需要在2D梯度上做。我让它的第一部分从一种颜色到一种清晰的颜色做一个垂直方向的渐变: + (void)addFadeout:(UIView *) view withColor:(UIColor *)color { UIColor * halfClearColor = [color colorWithAlphaComponent:0]; CALayer *layer = view.layer; layer.masksToBounds = YES; CAGrad
+ (void)addFadeout:(UIView *) view withColor:(UIColor *)color {
UIColor * halfClearColor = [color colorWithAlphaComponent:0];
CALayer *layer = view.layer;
layer.masksToBounds = YES;
CAGradientLayer *shineLayer = [CAGradientLayer layer];
shineLayer.frame = layer.bounds;
shineLayer.colors = @[
(id)color.CGColor,
(id)halfClearColor.CGColor];
shineLayer.locations = @[
[NSNumber numberWithFloat:0.0f],
[NSNumber numberWithFloat:1.0f]];
[view.layer insertSublayer:shineLayer atIndex:0];
}
但我还需要能够在水平方向上添加多种颜色,它们要么一起淡出,要么单独显示(仍然具有垂直渐变)。我知道我可以把它们加在一起,但这不是我想要的。。你会怎么做
可能是这样,但我似乎无法连接各个部分:
编辑1:
+ (void)addFadeout:(UIView *) view withColors:(NSArray *)colors { //CGColors
UIColor * someColor = [UIColor colorWithCGColor:((__bridge CGColorRef)[colors lastObject])];//only alpha channel used with more than one color
UIColor * halfClearColor = [someColor colorWithAlphaComponent:0];
CALayer *layer = view.layer;
layer.masksToBounds = YES;
CAGradientLayer *transparencyLayer = [CAGradientLayer layer];
transparencyLayer.frame = layer.bounds;
transparencyLayer.colors = @[
(id)someColor.CGColor,
(id)halfClearColor.CGColor];
transparencyLayer.locations = @[
[NSNumber numberWithFloat:0.0f],
[NSNumber numberWithFloat:1.0f]];
if(colors.count > 1){
CAGradientLayer * multiColoredLayer = [self getMultiColoredLayerWithColors:colors inLayer:layer];
multiColoredLayer.mask = transparencyLayer;
[view.layer insertSublayer:multiColoredLayer atIndex:0];
}
else{
[view.layer insertSublayer:transparencyLayer atIndex:0];
}
}
+ (CAGradientLayer *)getMultiColoredLayerWithColors:(NSArray *)colors inLayer:(CALayer *)layer{ //CGColors
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = layer.bounds;
gradientLayer.colors = colors;
gradientLayer.startPoint = CGPointMake(0, 0.5);
gradientLayer.endPoint = CGPointMake(1.0, 0.5);
return gradientLayer;
}
这就是我现在得到的:
可能不清楚我想要什么。我还需要沿x轴在多种颜色之间进行渐变。所以我得到的是这样的组合:(替换红色)
解决方案:
+ (void)addFadeout:(UIView *) view withColors:(NSArray *)colors { //CGColors
UIColor * someColor = [UIColor colorWithCGColor:((__bridge CGColorRef)[colors lastObject])];//only alpha channel used with more than one color
UIColor * halfClearColor = [someColor colorWithAlphaComponent:0];
CALayer *layer = view.layer;
layer.masksToBounds = YES;
CAGradientLayer *transparencyLayer = [CAGradientLayer layer];
transparencyLayer.frame = layer.bounds;
transparencyLayer.colors = @[
(id)someColor.CGColor,
(id)halfClearColor.CGColor];
transparencyLayer.locations = @[
[NSNumber numberWithFloat:0.0f],
[NSNumber numberWithFloat:1.0f]];
if(colors.count > 1){
CAGradientLayer * multiColoredLayer = [self getMultiColoredLayerWithColors:colors inLayer:layer];
multiColoredLayer.mask = transparencyLayer;
[view.layer insertSublayer:multiColoredLayer atIndex:0];
}
else{
[view.layer insertSublayer:transparencyLayer atIndex:0];
}
}
+ (CAGradientLayer *)getMultiColoredLayerWithColors:(NSArray *)colors inLayer:(CALayer *)layer{ //CGColors
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = layer.bounds;
gradientLayer.colors = colors;
gradientLayer.startPoint = CGPointMake(0, 0.5);
gradientLayer.endPoint = CGPointMake(1.0, 0.5);
return gradientLayer;
}
你需要使用2个“某物”,因为一次只能在一个方向上绘制渐变。您可以使用2个
CAGradientLayer
s,一个在另一个后面(或者一个作为另一个的子层)。或者,您可以使用2个CGGradient
s来完成,它们都被绘制到相同的上下文中
从您的评论中,您希望使用alpha掩码。应用具有透明度的“顶部”层的最佳方法是将其设置为“底部”层的
mask
:
CAGradientLayer *colorLayer = ...;
CAGradientLayer *transparencyLayer = ...;
colorLayer.mask = transparencyLayer;
在这种情况下,
transparencyLayer
中的任何颜色都将被忽略,只使用alpha值。您想要的结果是什么,很难判断?你是不是应该在你已经拥有的渐变视图后面再放一个渐变视图?就像在后面有一个渐变颜色,在前面有另一个渐变颜色,它将颜色渐变为白色/透明(在底部)?单个CAGradientLayer
只能在一个方向上具有渐变。是。。好的-没有CAGradientLayer它怎么可能?透明的渐变如何在另一个渐变上工作?在索引1处插入第二个渐变。