0

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

2 回答 2

0

从您的文档中CGGradientCreateWithColors(colorSpace, colors, locations[])可以阅读

数组应包含与locations数组相同数量的项目colors

我假设对于文档也是如此,CAGradientLayer但在文档中找不到任何内容。我做出这个假设是因为它是有道理的。您将如何真正解释两种颜色和三个位置?第三个位置应该是什么颜色?

更改您的代码,以便您传递与位置相同数量的颜色

于 2013-04-17T11:00:54.640 回答
0

创建一个大小为 3 的圆形矩形的自定义渐变视图,您需要添加 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
于 2013-04-17T12:40:37.143 回答