2012-05-12 5 views
2

Я пытаюсь использовать CAGradientLayer в качестве корневого уровня подкласса UIView, переопределяя метод класса classClass UIView. Я сделал ТОЧНО то же самое для подкласса UIButton, и все это отлично работает, однако для UIView я не вижу градиента, я просто вижу фоновый белый фон по умолчанию.CAGradientLayer как layerClass для 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

Вы должны устанавливать цвета слоя градиента в методах сеттера для высоких и низких цветов, а не для drawRect. Также обратите внимание, что свойство 'colors' неявно анимируется, поэтому вы должны установить его внутри CATransaction с disableActions, установленным в YES – jrturton

ответ

2

Я пробовал свой код и не видел вообще никакого градиента. Если я установил цвет фона представления в clearColor в методе awakeFromNib, он работал.

+0

. Это работает, но я не совсем уверен, почему, то есть что отличается от UIButton и UIView в этом случае? Принимая этот ответ, но все равно будет любить какое-то дальнейшее объяснение от кого-либо. – nickbona

+0

@nickbona, Если вы регистрируете цвет фона UIView, вы получаете «UIDeviceRGBColorSpace 0.75 0.75 0.75 1», но если вы регистрируете фоновый цвет UIButton, вы получаете NULL - я не знаю, почему это так, но это Как оно есть. – rdelmar

2

Поскольку по умолчанию непрозрачный вид имеет значение ДА, это означает, что перед рисованием содержимого изображение должно рисовать фон. Если вы установите customView.opaque = NO; после начала представления. Что касается Button, то по умолчанию непрозрачность No, и вы можете видеть в IB, контекст Clears Graphics - YES.

Смежные вопросы