【问题标题】:CAGradientLayer as layerClass for UIViewCAGradientLayer 作为 UIView 的 layerClass
【发布时间】:2012-05-12 03:24:53
【问题描述】:

我试图通过覆盖 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

任何人都可以阐明我的问题所在吗?

【问题讨论】:

  • 你应该在你的设置方法中为高低颜色设置渐变层的颜色,而不是 drawRect。另请注意,colors 属性是隐式动画的,因此您应该在 CATransaction 中将其设置为 disableActions 设置为 YES

标签: objective-c ios cocoa calayer


【解决方案1】:

我试过你的代码,一开始也没有看到渐变。如果我在视图的 awakeFromNib 方法中将视图的背景颜色设置为 clearColor,它就起作用了。

【讨论】:

  • 这可行,但我不太清楚为什么,即在这种情况下 UIButton 和 UIView 有什么不同?接受这个答案,但仍然希望任何人进一步解释。
  • @nickbona,如果你记录 UIView 的背景颜色,你会得到“UIDeviceRGBColorSpace 0.75 0.75 0.75 1”,但是如果你记录 UIButton 的背景颜色,你会得到 NULL——我不知道为什么会这样,但事实就是这样。
【解决方案2】:

因为视图默认的 opaque 是 YES,也就是说,视图必须在绘制内容之前绘制背景。如果你设置 customView.opaque = NO;在视图启动后。至于Button,默认不透明是No,在IB中可以看到Clears Graphics Context是YES。

【讨论】:

    猜你喜欢
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多