ios - 用 CAGradientLayer 替换 CALayer 不起作用

标签 ios objective-c calayer quartz-core

我正在使用最新的 SDK 开发 iOS 应用程序。

我想动态更改背景层:

#import <QuartzCore/QuartzCore.h>
@interface MyClass : UIView
{
@private
    CALayer* _gradientBackground;
}

还有一些方法:

- (CALayer*)createLayerWithColor:(UIColor*)color
{
    CALayer* layer  = [CALayer layer];
    layer.frame = CGRectMake(NSLayerX, NSLayerY,
                                     NSLayerWidth, NSLayerHeight);
    layer.backgroundColor = [color CGColor];
    layer.cornerRadius = NSCornerRadius;

    return layer;
}
- (CAGradientLayer*)createLayerWithGradient:(UIColor*)startColor
                                   endColor:(UIColor*)endColor
{
    CAGradientLayer* gradientLayer  = [CAGradientLayer layer];
    gradientLayer.frame = CGRectMake(NSLayerX, NSLayerY,
                                     NSLayerWidth, NSLayerHeight);
    gradientLayer.colors =
        [NSArray arrayWithObjects:(id)[startColor CGColor],
                                  (id)[endColor CGColor], nil];
    gradientLayer.cornerRadius = NSCornerRadius;

    return gradientLayer;
}

- (void)changeBackgroundWithLayer:(CALayer*)newLayer
{
    if (_gradientBackground != nil)
        [_gradientBackground removeFromSuperlayer];

    _gradientBackground = newLayer;
    [self.layer insertSublayer:newLayer atIndex:0];
}

我这样做是为了更改背景层:

[self changeBackgroundWithLayer:[self createLayerWithGradient:startColor endColor:endColor]];

有时会这样:

[self changeBackgroundWithLayer:[self createLayerWithColor:newColor]];

我的做法是: 第一个实体层,下一个渐变层,最后一个实体层。

我也尝试过使用此代码,但没有结果:

- (void)changeBackgroundWithLayer:(CALayer*)newLayer
{
    if (_gradientBackground != nil)
        [self.layer replaceSublayer:_gradientBackground with:newLayer];
    else
        [self.layer insertSublayer:newLayer atIndex:0];
    _gradientBackground = newLayer;
}

但它不起作用。

有什么建议吗?

最佳答案

试试这个

- (void)changeBackgroundWithLayer:(CALayer*)newLayer
{
    [_gradientBackground removeFromSuperlayer], _gradientBackground = nil;
    [self.layer insertSublayer:newLayer atIndex:0];
    _gradientBackground = newLayer;
}

这将删除 _gradientBackground 并将其设置为 nil 在任何情况下,这在 Objective-C 中是完全可以接受的。 newLayer 已添加到图层层次结构中,并且 gradientBackground 图层已更新。

关于ios - 用 CAGradientLayer 替换 CALayer 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15568170/

相关文章:

ios - Xcode 中的键盘不显示调试器输出

ios - 线程 1 : signal SIGABRT - AppDelegate. h

ios - 如何清除/清零用于通过串行端口接收字符的 NSMutableString?

For循环中的iOS 7 CA层旋转

ios - 圆角仅适用于 UITableView 的底部边缘

ios - 多层动画,如何仅暂停其中一层

javascript - iOS Chrome - 如何计算窗口高度减去地址栏高度

ios - 在 UISCROLLVIEW 中滚动内容时,背景图像也会滚动

objective-c - -[NSString sizeWithFont :] returns different results in release and debug builds

ios - 使用图层渐变点击按钮时更改外观