我在viewDidLoad的后台有一个CAGradientLayer绘图。它在某些时候有效,但有时它只是在我重新启动计算机之前不会持续渲染任何东西。我无法弄清楚为什么有些时候它会起作用,然后其他时候它会赢。它会工作让我们连续说5个构建然后它将停止渲染。没有错误。有人有这方面的经验吗?
背景图层方法:
+ (CAGradientLayer*) morningGradient {
UIColor *mornTop = [UIColor colorWithRed:0.843 green:0.722 blue:0.667 alpha:1.000];
UIColor *mornBottom = [UIColor colorWithRed:0.584 green:0.733 blue:0.945 alpha:1.000];
NSArray *colors = [NSArray arrayWithObjects:(id)mornTop.CGColor, mornBottom.CGColor, nil];
NSNumber *stopOne = [NSNumber numberWithFloat:0.0];
NSNumber *stopTwo = [NSNumber numberWithFloat:0.7];
NSNumber *stopThree = [NSNumber numberWithFloat:1.0];
NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, stopThree, nil];
CAGradientLayer *headerLayer = [CAGradientLayer layer];
headerLayer.colors = colors;
headerLayer.locations = locations;
return headerLayer;
}
绘制方法:
-(void)drawGrad
{
NSLog(@"drawing gradient");
CAGradientLayer *bgLayer = [BackgroundLayer morningGradient];
bgLayer.frame = self.view.bounds;
[self.view.layer insertSublayer:bgLayer atIndex:0];
}
viewDidLoad中:
- (void)viewDidLoad
{
[self drawGrad];
[super viewDidLoad];
}
答案 0 :(得分:0)
从CGGradientCreateWithColors(colorSpace, colors, locations[])
的文档中,您可以阅读
locations
数组应包含与colors
数组相同数量的项目。
我假设CAGradientLayer
也是如此,但在文档中找不到任何内容。我正在做这个假设,因为它是有道理的。你怎么会真正解释两种颜色和三种位置?第三个位置应该是什么颜色?
更改您的代码,以便传递与位置相同数量的颜色。
答案 1 :(得分:0)
创建一个大小为3的圆形rect的自定义渐变视图,你需要添加QuartzCore框架,然后按照下面的代码(.h文件和.m文件)
#import <UIKit/UIKit.h>
@interface CustomGradientView : UIView
@end
#import "CustomGradientView.h"
#import <QuartzCore/QuartzCore.h>
@implementation CustomGradientView
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
UIColor *color1=[UIColor whiteColor];
CGColorRef startColor =color1.CGColor;
UIColor *color2=[UIColor redColor];
CGColorRef endColor = color2.CGColor;
drawLinearGradient(context, rect, startColor, endColor);
CGPathRef p = [[UIBezierPath bezierPathWithRoundedRect:rect
cornerRadius:3] CGPath];
CGContextAddRect(context, rect);
CGContextAddPath(context, p);
CGContextEOClip(context);
CGContextClearRect(context, rect);
}
@end