我在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];
请帮帮我。
答案 0 :(得分:2)
渐变颜色应为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];
顺便说一下,你忘了设置渐变的起点和终点。
答案 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中。
如果您想要直线向上和向下渐变,则无需设置startPoint
和endPoint
。这是最常见的所需配置,因此是默认配置。此外,今天优先使用对象文字语法进行数组创建,而不是@selector(arrayWithObjects:)
。
不要忘记设置自定义layerClass
子类的UIView
类方法。