0

我需要制作 2D 渐变。我有它的第一部分从颜色到清晰颜色的渐变垂直方向:

+ (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];
}

但我还需要能够在水平方向添加多种颜色,它们要么一起淡化,要么分别显示(仍然具有垂直渐变)。我知道我可以把它们加在一起,但这不是我想要的。你会怎么做?

它可能是这样的,但我似乎无法连接这些部分: http ://cupsofcocoa.com/tag/gradient/ https://developer.apple.com/library/mac/#documentation/graphicsimaging/conceptual/用quartz2d/dq_shadings/dq_shadings.html绘图

编辑1:

这就是我现在得到的:

当前梯度

可能不清楚我想要什么。我还想要多个颜色之间沿 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;
}
4

1 回答 1

1

您需要使用 2 个“某物”,因为一次只能在一个方向上绘制渐变。您可以使用 2CAGradientLayer秒,一个在另一个之后(或一个作为另一个的子层)来完成。或者,您可以使用 2 CGGradients 来完成,两者都被绘制到相同的上下文中。


从您的评论中,您想要 alpha 掩码。应用具有透明度的“顶层”层的最佳方法是将其设置为mask“底层”层:

CAGradientLayer *colorLayer = ...;
CAGradientLayer *transparencyLayer = ...;

colorLayer.mask = transparencyLayer;

在这种情况下,将transparencyLayer忽略 中的任何颜色,仅使用 alpha 值。

于 2013-06-24T20:08:37.757 回答