CAGradientLayer有时无法渲染

时间:2013-04-17 10:04:20

标签: ios objective-c xcode calayer

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

2 个答案:

答案 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