使用CAGradientLayer作为背景,同时使用drawRect绘制上下文:

Ans*_*sig 2 iphone objective-c

我正在编写一个应用程序,将一些数据绘制成一个简单的图形,有时想在后台绘制比例.为此,我有一个UIView子类,它充当图形背景,只需使用drawRect:方法绘制比例(数据元素将作为子视图添加到此视图中,因为我希望用户能够与它们进行交互) .

但是,我还想要一个渐变背景颜色,并为此目的使用了CAGradientLayer(如此线程中所示).但是当我将其添加为子图层时,会出现渐变背景,但我在drawRect中执行的操作:显示!

我确定我遗漏了一些简单的东西或误解了如何使用CAGradientLayer或其他东西,所以任何帮助或建议都值得赞赏!

这是我的UIView子类中的相关代码:

- (id)initWithFrame:(CGRect)frame {

    if (self = [super initWithFrame:frame]) {

         // Create a gradient background
        CAGradientLayer *gradientBackground = [CAGradientLayer layer];
        gradientBackground.frame = self.bounds;
        gradientBackground.colors = [NSArray arrayWithObjects:(id)[[UIColor grayColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
        [self.layer insertSublayer:gradientBackground atIndex:0];
    }

    return self;
}

- (void)drawRect:(CGRect)rect {

    // Get the graphics context
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Clear the context
    CGContextClearRect(context, rect);

    // Call actual draw method 
    [self drawInContext:context];
}

-(void)drawInContext:(CGContextRef)context {

CGFloat step;

// Draw Y scale
if (displayYScale) {

    CGContextSetRGBStrokeColor(context, 0, 0, 0, kScaleLineAlpha);

    if (yAxisScale.mode == FCGraphScaleModeData) {

        step = (self.frame.size.height-(yAxisScale.padding*2))/yAxisScale.dataRange.maximum;
        for (int i = 0; i <= yAxisScale.dataRange.maximum; i++) {

            CGContextMoveToPoint(context, 0.0f, (step*i)+yAxisScale.padding);
            CGContextAddLineToPoint(context, self.frame.size.width, (step*i)+yAxisScale.padding);
        }

    } else if (yAxisScale.mode == FCGraphScaleModeDates) {

        int units = (int)[yAxisScale units];
        step = (self.frame.size.height-(yAxisScale.padding*2))/units;
        for (int i = 0; i <= units; i++) {

            CGContextMoveToPoint(context, 0.0f, (step*i)+yAxisScale.padding);
            CGContextAddLineToPoint(context, self.frame.size.width, (step*i)+yAxisScale.padding);
        }
    }

    CGContextStrokePath(context);
}

// Draw X scale
if (displayXScale) {

    CGContextSetRGBStrokeColor(context, 0, 0, 255, kScaleLineAlpha);

    if (xAxisScale.mode == FCGraphScaleModeData) {

        step = (self.frame.size.width-(xAxisScale.padding*2))/xAxisScale.dataRange.maximum;
        for (int i = 0; i <= xAxisScale.dataRange.maximum; i++) {

            CGContextMoveToPoint(context, (step*i)+xAxisScale.padding, 0.0f);
            CGContextAddLineToPoint(context, (step*i)+xAxisScale.padding, self.frame.size.height);
        }

    } else if (xAxisScale.mode == FCGraphScaleModeDates) {

        int units = (int)[xAxisScale units];
        step = (self.frame.size.width-(xAxisScale.padding*2))/units;
        for (int i = 0; i <= units; i++) {

            CGContextMoveToPoint(context, (step*i)+xAxisScale.padding, 0.0f);
            CGContextAddLineToPoint(context, (step*i)+xAxisScale.padding, self.frame.size.height);
        }
    }

    CGContextStrokePath(context);
}
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

/安德斯

nsc*_*hum 5

既然你正在绘画,你也可以绘制自己的渐变:

// the colors
CGColorRef topColor = [[UIColor grayColor] CGColor];
CGColorRef bottomColor = [[UIColor whiteColor] CGColor];
NSArray *colors =
    [NSArray arrayWithObjects: (id)topColor, (id)bottomColor, nil];
CGFloat locations[] = {0, 1};

CGGradientRef gradient =
    CGGradientCreateWithColors(CGColorGetColorSpace(topColor),
                               (CFArrayRef)colors, locations);

// the start/end points
CGRect bounds = self.bounds;
CGPoint top = CGPointMake(CGRectGetMidX(bounds), bounds.origin.y);
CGPoint bottom = CGPointMake(CGRectGetMidX(bounds), CGRectGetMaxY(bounds));

// draw
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawLinearGradient(context, gradient, top, bottom, 0);

CGGradientRelease(gradient);
Run Code Online (Sandbox Code Playgroud)