我有一个UIViewController,在主根视图中我创建了一个自定义类,在drawRect中我创建了一个渐变颜色的图层并添加到它:
[self.layer insertSublayer:bgLayer atIndex:0];
我想使用此视图为我的所有视图提供相同的背景颜色。
现在,我(在故事板中)添加了5个标签并在视图中组合在一起(编辑器 - >嵌入式 - >视图)。
所以现在我已经创建了另一个UIView的子类,并且在draw rect中我有:
[self setBackgroundColor:[UIColor redColor]];
(现在我有简单的红色,后来我想要阴影,边框ecc)
因为我希望这个子视图(带有5个标签)是红色的(当然,背景必须保持渐变)。
当我运行应用程序时,我正确地看到背景,但是我将红色设置为红色的视图显示为全黑。
如果在故事板中我将背景更改为“清除颜色”(在应该为红色的视图中),则会显示5个标签,背景与主视图相同。
我已经为“红色视图”的drawRect设置了一个断点,这个被调用但没有任何事情发生。
答案 0 :(得分:1)
我建议你看看Appearance Proxies。你可以用他们更轻松地做你想做的事情。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
[MyCustomView appearance].backgroundColor = [UIColor clearColor];
...
}
此外,您可能不应该在drawRect中添加子图层,尤其是在您的观看次数不移动或调整大小的情况下。我通常只是在-(void)awakeFromNib
中添加它们。
修改强>
要直接解决您的问题,我发现在自定义视图中创建渐变背景的最佳方法是覆盖+(Class)layerClass
以提供渐变图层。这将使您的自定义视图的基础层成为您返回的任何层类。通常,这可以是例如形状层(对于纯色)。在我们的例子中,我们想要一个CAGradientLayer。然后在-(void)awakeFromNib
中,您可以设置渐变颜色而不会破坏子图层。
我猜测的是你的原始问题是你在没有设置开始和结束颜色的情况下添加渐变子图层,这些颜色会在背景颜色上绘制为黑色。
示例:
@implementation MyCustomView
+ (Class)layerClass {
return [CAGradientLayer class];
}
- (void)awakeFromNib {
CAGradientLayer* gradientLayer = (CAGradientLayer*)self.layer;
gradientLayer.locations = @[@0, @1];
gradientLayer.colors = @[(id)[UIColor redColor].CGColor, (id)[UIColor greenColor].CGColor];
}
如果您需要更多详细信息或者这不适合您,请告诉我。