2012-05-12 26 views
2

我想通過重寫UIView的layerClass類的方法來使用CAGradientLayer作爲UIView子類的根層。我爲UIButton子類做了同樣的事情,並且它完美地工作,但是對於UIView,我沒有看到漸變,我只看到了默認的白色視圖背景。CAGradientLayer作爲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 

任何人都可以擺脫在哪裏我的問題在於一些輕?

+0

你應該設置梯度圖層的顏色在你的setter方法中的高和低顏色,而不是drawRect。還要注意'colors'屬性是隱含動畫的,所以你應該將它設置在一個CATransaction中,其中disableActions設置爲YES – jrturton

回答

2

我試過你的代碼,並且一開始也沒有看到漸變。如果我在視圖的awakeFromNib方法中將視圖的背景顏色設置爲clearColor,它就起作用了。

+0

這有效,但我不太確定爲什麼,即在這種情況下UIButton和UIView有什麼不同?接受這個答案,但仍然喜歡來自任何人的進一步解釋。 – nickbona

+0

@nickbona,如果你記錄一個UIView的背景顏色,你會得到「UIDeviceRGBColorSpace 0.75 0.75 0.75 1」,但是如果你記錄一個UIButton的背景顏色,你會得到NULL - 我不知道它爲什麼是這樣,但這是事情是這樣的。 – rdelmar

2

由於視圖的默認不透明爲YES,這意味着視圖必須在繪製內容之前繪製背景。如果你設置customView.opaque = NO;視圖啓動後。至於按鈕,默認不透明是否,您可以在IB中看到清除圖形上下文爲YES。

相關問題