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

4

我希望当我触发一个操作时,可以改变我的渐变背景的颜色。我已经尝试了很多方法,但都没有成功。

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种情况。我希望第一种情况(远离)是蓝色渐变的,第二种情况(接近)是灰色渐变的。我在“(void)viewWillAppear:(BOOL)animated”方法中初始化了这个层,然后我尝试在did range delegate方法中使用:

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];
....

无法工作。

有人能够帮忙吗?我需要一种解决方案,可以在我处于“附近”时更改背景颜色,并在我处于“远离”时重新更改回来。

非常感谢您的帮助。


“not working” 是什么意思?梯度没有切换吗?正确的 case 语句是否被执行? - rdelmar
是的,正确的情况被执行了,但颜色没有改变。或者当我移除图层时会出现错误。我的视图中的元素消失了,颜色也没有改变。抱歉我的英语不好,我是法国人。 - mad_mask
1
如果你的图层本身正在绘制任何东西,那么你的子图层将会在其上进行绘制。这类似于将子视图添加到视图时所看到的行为:无论你在哪个索引处插入它,它总是覆盖父视图。你可能想要做的是将一个子视图添加到self.view中,从而容纳所有内容,然后只需将self.view的图层更改为渐变即可。 - Ian MacDonald
缺少图层的框架? - Larme
Larme,不,我没有黑屏,我能看到颜色,但它没有改变。或者用另一种解决方案,我有丢失的内容。 - mad_mask
1个回答

4

我没有使用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];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接