自定义视图的渐变颜色

时间:2013-07-09 07:53:41

标签: ios objective-c cagradientlayer

我在UIViewController中创建了 3个自定义视图。在每个自定义视图中,我使用CAShapeLayer 创建了形状。

这些图层还包含渐变颜色。现在我想将渐变颜色设置为自定义视图。当我试图这样做时,它正在崩溃。对于第一个视图,这是代码:

//first component
    self.aTimeScaleMonthView = [[TimeScaleView alloc] initWithFrame:CGRectMake(ORIGIN_X, frame.origin.y, frame.size.width-(2*ORIGIN_X), HEIGHT_OF_COMPONENT1) withStartDate:startDate endDate:endDate];
    self.aTimeScaleMonthView.modeOfScale = A3TimeScaleMonth;
    self.aTimeScaleMonthView.layer.borderColor = [UIColor blackColor].CGColor;
    self.aTimeScaleMonthView.layer.borderWidth = BORDER_WIDTH_BOX;

    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = self.aTimeScaleMonthView.bounds;
    gradient.colors = [NSArray arrayWithObjects:[UIColor colorWithRed:0.66 green:0.29 blue:0.22 alpha:1.0], [UIColor colorWithRed:0.62 green:0.51 blue:0.314 alpha:1.0], nil];

    [self.aTimeScaleMonthView.layer insertSublayer:gradient atIndex:0];
    [self addSubview: self.aTimeScaleMonthView];

请帮帮我。

2 个答案:

答案 0 :(得分:2)

渐变颜色应为CGColorgradient.colors = [NSArray arrayWithObjects:(id)[UIColor colorWithRed:0.66 green:0.29 blue:0.22 alpha:1.0].CGColor, (id)[UIColor colorWithRed:0.62 green:0.51 blue:0.314 alpha:1.0].CGColor, nil];

顺便说一下,你忘了设置渐变的起点和终点。

答案 1 :(得分:0)

CALayer及其子类采用CGColor,而非UIColor。您可以通过访问UIColor个实例的CGColor属性,将CGColor转换为Core Graphics颜色结构UIColor

同样重要的是要理解:CoreFoundation结构&那些相关的C API,如CoreGraphics(以CG开头的任何东西都与CoreGraphics相关)不能直接插入NSArray,因为它们不是面向对象的。您必须将结构强制转换为id以将其置于NSArray实例中。您使用围绕要转换的类型的parens在Objective-C中进行投射。在这种情况下,您将执行以下操作:

gradient.colors = @[(id)[UIColor colorWithRed:0.66 green:0.29 blue:0.22 alpha:1.0].CGColor, (id)[UIColor colorWithRed:0.62 green:0.51 blue:0.314 alpha:1.0].CGColor];

为了使您的代码更具可读性并且您的颜色可重复使用,您应该将颜色分配给描述性变量,并将这些变量添加到NSArray中。

如果您想要直线向上和向下渐变,则无需设置startPointendPoint。这是最常见的所需配置,因此是默认配置。此外,今天优先使用对象文字语法进行数组创建,而不是@selector(arrayWithObjects:)

不要忘记设置自定义layerClass子类的UIView类方法。