2

UIViewのlayerClassクラスメソッドをオーバーライドして、UIViewサブクラスのルートレイヤーとしてCAGradientLayerを使用しようとしています。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

誰かが私の問題がどこにあるのかを明らかにすることができますか?

4

2 に答える 2

2

ビューのデフォルトの opaque は YES であるため、ビューはコンテンツを描画する前に背景を描画する必要があります。customView.opaque = NO; を設定した場合。ビューの開始後。Button に関しては、デフォルトの opaque は No であり、IB で Clears Graphics Context が YES であることがわかります。

于 2012-08-02T03:02:23.257 に答える
2

私はあなたのコードを試しましたが、最初はグラデーションも見られませんでした。ビューのawakeFromNibメソッドでビューの背景色をclearColorに設定すると、うまくいきました。

于 2012-05-12T06:55:25.150 に答える