【问题标题】:Replace a CALayer with a CAGradientLayer doesn't work用 CAGradientLayer 替换 CALayer 不起作用
【发布时间】:2013-03-12 04:21:15
【问题描述】:

我正在使用最新的 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;
}

但它不起作用。

有什么建议吗?

【问题讨论】:

    标签: ios objective-c calayer quartz-core


    【解决方案1】:

    试试这个

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2018-05-02
      • 2018-04-27
      相关资源
      最近更新 更多