Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c CAGradientLayer作为UIView的layerClass_Objective C_Ios_Cocoa_Calayer - Fatal编程技术网

Objective c CAGradientLayer作为UIView的layerClass

Objective c CAGradientLayer作为UIView的layerClass,objective-c,ios,cocoa,calayer,Objective C,Ios,Cocoa,Calayer,我试图通过重写UIView的layerClass类方法,将CAGradientLayer用作UIView子类的根层。我为UIButton子类做了完全相同的事情,并且它都非常完美,但是对于UIView,我没有看到渐变,我只看到默认的白色视图背景 这是我的密码: #import <UIKit/UIKit.h> #import "UIView+NBStyle.h" @interface NBStylizedView : UIView @property (nonatomic, stro

我试图通过重写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

谁能解释一下我的问题在哪里

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

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

因为视图的默认不透明为YES,这意味着视图必须在绘制内容之前绘制背景。如果设置customView.opaque=NO;在视图启动之后。至于按钮,默认不透明是否,您可以在IB中看到Clears Graphics上下文是YES。

因为视图的默认不透明是YES,这意味着视图必须在绘制内容之前绘制背景。如果设置customView.opaque=NO;在视图启动之后。至于按钮,默认不透明为否,您可以在IB中看到Clears Graphics上下文为YES。

您应该在设置器方法中为高颜色和低颜色设置渐变层的颜色,而不是drawRect。还请注意,颜色属性是隐式设置动画的,因此您应该在CATTransaction中设置它,并将disableActions设置为Yes。您应该在setter方法中为高颜色和低颜色设置渐变层的颜色,而不是drawRect。还要注意的是,colors属性是隐式动画的,因此您应该将其设置在CATTransaction中,并将disableActions设置为YESThis works,但我不太清楚原因,即在这种情况下UIButton和UIView之间有什么不同?接受这个答案,但仍然希望得到任何人的进一步解释。@nickbona,如果你记录UIView的背景色,你会得到UIDeviceRbColorSpace 0.75 0.75 1,但是如果你记录UIButton的背景色,你会得到空值-我不知道为什么会这样,但这就是它的方式。这是可行的,但我不太确定为什么,也就是说,在这种情况下,UIButton和UIView有什么不同?接受这个答案,但仍然希望得到任何人的进一步解释。@nickbona,如果你记录UIView的背景色,你会得到UIDeviceGBColorSpace 0.75 0.75 0.75 1,但是如果你记录UIButton的背景色,你会得到空值-我不知道为什么会这样,但事实就是这样。