渐变颜色到自定义视图

Posted

技术标签:

【中文标题】渐变颜色到自定义视图【英文标题】:Gradient Color to Custom View 【发布时间】:2013-07-09 07:53:41 【问题描述】:

我在 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];

请帮帮我。

【问题讨论】:

【参考方案1】:

渐变色应该是CGColor:gradient.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];

顺便说一句,您忘记为渐变设置起点和终点。

【讨论】:

【参考方案2】:

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

同样重要的是要理解:CoreFoundation 结构和相关 C API 的结构,例如 CoreGraphics(任何以 CG 开头的都与 CoreGraphics 相关)不能直接插入到NSArray,因为它们不是面向对象的。您必须将结构转换为 id 以将其放置在 NSArray 实例中。您在 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:) 更受欢迎。

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

【讨论】:

谁在没有评论的情况下对我投了反对票(特别是考虑到我的回答正确且非常详细)——这是粗鲁的,不是在 Stack Overflow 上的行为方式。如果没有描述性评论说明反对票的用途,任何人都不会从反对票中学习。

以上是关于渐变颜色到自定义视图的主要内容,如果未能解决你的问题,请参考以下文章

无法将文本绘制到自定义视图

将多个视图合并到自定义视图中

如何将子视图添加到自定义 UICollectionViewCell

由于自动布局没有计算尺寸,将子视图添加到自定义视图最终会出错

将子视图添加到自定义类

将子视图添加到自定义 viewForHeaderInSection 会中断 VoiceOver 导航