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