0

最新の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;
}

しかし、それは機能しません。

何かアドバイス?

4

1 に答える 1

1

これを試して

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

これにより、すべての場合に が削除され、_gradientBackgroundに設定されnilます。これは、Objective-C では完全に受け入れられます。newLayerがレイヤー階層に追加され、レイヤーgradientBackgroundが更新されます。

于 2013-03-22T15:14:59.320 に答える