使用 CAGradientLayer 类更改 UiView IOS 的渐变背景图层颜色

Posted

技术标签:

【中文标题】使用 CAGradientLayer 类更改 UiView IOS 的渐变背景图层颜色【英文标题】:Changing Gradient Background layer color for UiView IOS using CAGradientLayer classe 【发布时间】:2015-02-04 17:39:14 【问题描述】:

我想在触发动作时更改渐变背景的颜色。 我尝试了很多方法都没有成功。

BackgroundLayer.h

    #import <Foundation/Foundation.h>
    #import <QuartzCore/QuartzCore.h>

    @interface BackgroundLayer : NSObject

    +(CAGradientLayer*) greyGradient;
    +(CAGradientLayer*) blueGradient;

    @end

BackgroundLayer.m

@implementation BackgroundLayer

//Metallic grey gradient background
+ (CAGradientLayer*) greyGradient 

    UIColor *colorOne = [UIColor colorWithWhite:0.9 alpha:1.0];
    UIColor *colorTwo = [UIColor colorWithHue:0.625 saturation:0.0 brightness:0.85 alpha:1.0];
    UIColor *colorThree     = [UIColor colorWithHue:0.625 saturation:0.0 brightness:0.7 alpha:1.0];
    UIColor *colorFour = [UIColor colorWithHue:0.625 saturation:0.0 brightness:0.4 alpha:1.0];

    NSArray *colors =  [NSArray arrayWithObjects:(id)colorOne.CGColor, colorTwo.CGColor, colorThree.CGColor, colorFour.CGColor, nil];

    NSNumber *stopOne = [NSNumber numberWithFloat:0.0];
    NSNumber *stopTwo = [NSNumber numberWithFloat:0.02];
    NSNumber *stopThree     = [NSNumber numberWithFloat:0.99];
    NSNumber *stopFour = [NSNumber numberWithFloat:1.0];

    NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, stopThree, stopFour, nil];
    CAGradientLayer *headerLayer = [CAGradientLayer layer];
    headerLayer.colors = colors;
    headerLayer.locations = locations;

    return headerLayer;



//Blue gradient background
+ (CAGradientLayer*) blueGradient 

    UIColor *colorOne = [UIColor colorWithRed:(120/255.0) green:(135/255.0) blue:(150/255.0) alpha:1.0];
    UIColor *colorTwo = [UIColor colorWithRed:(57/255.0)  green:(79/255.0)  blue:(96/255.0)  alpha:1.0];

    NSArray *colors = [NSArray arrayWithObjects:(id)colorOne.CGColor, colorTwo.CGColor, nil];
    NSNumber *stopOne = [NSNumber numberWithFloat:0.0];
    NSNumber *stopTwo = [NSNumber numberWithFloat:1.0];

    NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, nil];

    CAGradientLayer *headerLayer = [CAGradientLayer layer];
    headerLayer.colors = colors;
    headerLayer.locations = locations;

    return headerLayer;



@end

在我的视图控制器中,我有一个接近开关(我使用 ibeacon)。 开关有4个案例。我想要带有蓝色渐变的案例 1(远)。带有灰色渐变的案例 2(近)。我用“(void)viewWillAppear:(BOOL)animated”中的层初始化,然后我在做范围委托中尝试了:

case CLProximityFar:


[[[self.view.layer sublayers] objectAtIndex:0] removeFromSuperlayer];
self.bgLayer = [BackgroundLayer blueGradient];
self.bgLayer.frame = self.view.bounds;
[self.view.layer insertSublayer:self.bgLayer atIndex:0];
....

不工作。 我也试过这样

case CLProximityNear:


[[[self.view.layer sublayers] objectAtIndex:0] removeFromSuperlayer];
CAGradientLayer *gradient = [[self.view.layer sublayers] firstObject];
gradient = [BackgroundLayer blueGradient];
[self.view.layer insertSublayer:gradient atIndex:0];
[self.view.layer setNeedsDisplay];
....

不工作。

有人可以帮助我吗?我需要一个解决方案,当我在“近”时改变背景颜色,当我在“远”时重新改变它。

提前感谢您的帮助。

【问题讨论】:

“不工作”是什么意思?渐变不切换?是否正在执行正确的 case 语句? 是的,正确的案例被执行,但颜色没有改变。或者当我删除图层时我有错误。我认为的元素消失了,颜色没有改变。对不起我的英语不好,我是法国人。 如果你的图层本身正在绘制任何东西,你的子图层将被绘制在它上面。这类似于将子视图添加到视图时看到的行为:无论您将其插入到哪个索引,它总是覆盖父视图。您可能想要做的是向您的self.view 添加一个子视图,您可以在其中保存所有内容,然后将self.view 的图层更改为渐变。 缺少图层的框架? Larme,不,我没有黑屏,我看到颜色但它没有改变。或者使用其他解决方案我缺少内容。 【参考方案1】:

我没有使用 iBeacon,所以在这个测试中,我使用了分段控件在图层之间切换。让它适应您的应用应该很容易。

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    CAGradientLayer *bg = [BackgroundLayer greyGradient];
    bg.frame = self.view.bounds;
    [self.view.layer insertSublayer:bg atIndex:0];


-(IBAction)changeGradient:(UISegmentedControl *)sender 

    CAGradientLayer *layerToRemove;
    for (CALayer *aLayer in self.view.layer.sublayers) 
        if ([aLayer isKindOfClass:[CAGradientLayer class]]) 
            layerToRemove = (CAGradientLayer *)aLayer;
        
    
    [layerToRemove removeFromSuperlayer];

    CAGradientLayer *bg;
    if (sender.selectedSegmentIndex == 0) 
        bg = [BackgroundLayer greyGradient];
    else
        bg = [BackgroundLayer blueGradient];
    

    bg.frame = self.view.bounds;
    [self.view.layer insertSublayer:bg atIndex:0];

【讨论】:

以上是关于使用 CAGradientLayer 类更改 UiView IOS 的渐变背景图层颜色的主要内容,如果未能解决你的问题,请参考以下文章

使用滑块实时更改 CAGradientLayer 的颜色

禁用按钮时更改或删除我的 CAGradientLayer

如何像屏幕保护程序一样更改 CAGradientLayer 的颜色?

CAGradientLayer 颜色更改动画未执行

为啥我的 CAGradientLayer 为所有更改设置动画?

如何更改 CAGradientLayer 色点?