CAGradientLayer作为UIView的layerClass

时间:2012-05-12 03:24:53

标签: objective-c ios cocoa calayer

我试图通过覆盖UIView的layerClass类方法来使用CAGradientLayer作为UIView子类的根层。我为UIButton子类做了完全相同的事情,并且它完美地工作,但是对于UIView,我没有看到渐变,我只看到默认的白色视图背景。

这是我的代码:

#import <UIKit/UIKit.h>
#import "UIView+NBStyle.h"

@interface NBStylizedView : UIView

@property (nonatomic, strong) UIColor* highColor;
@property (nonatomic, strong) UIColor* lowColor;

@end

...

#import "NBStylizedView.h"
#import <QuartzCore/QuartzCore.h>

@implementation NBStylizedView

@synthesize highColor;
@synthesize lowColor;

+ (Class) layerClass {
    return [CAGradientLayer class];
}

- (void)drawRect:(CGRect)rect {
    if (self.highColor && self.lowColor) {
        CAGradientLayer* gLayer = (CAGradientLayer*) self.layer;
        [gLayer setColors:
         [NSArray arrayWithObjects:
          (id)[self.highColor CGColor], 
          (id)[self.lowColor CGColor], nil]];
    }   
    [super drawRect:rect];
}

- (void)setHighColor:(UIColor*)color {
    highColor = color;
    [self.layer setNeedsDisplay];
}

- (void)setLowColor:(UIColor*)color {
    lowColor = color;
    [self.layer setNeedsDisplay];
}

@end

任何人都可以了解我的问题所在吗?

2 个答案:

答案 0 :(得分:2)

我尝试了你的代码,并且最初也看不到任何渐变。如果我在视图的awakeFromNib方法中将视图的背景颜色设置为clearColor,则它可以工作。

答案 1 :(得分:2)

因为视图的默认不透明是YES,这意味着视图必须在绘制内容之前绘制背景。如果设置customView.opaque = NO;在视图开始之后。对于Button,默认的opaque是No,你可以在IB中看到Clears Graphics Context是YES。