CGContextSetShadowWithColor不起作用

时间:2012-02-27 03:40:42

标签: iphone objective-c core-graphics

此代码应显示阴影,但不是:

CGContextRef context = UIGraphicsGetCurrentContext();

//Border
CGMutablePathRef outerPath = createRoundedRectForRect(self.bounds, MENU_BUTTON_OUTER_RADIUS);

CGContextSetFillColorWithColor(context, [[UIColor colorWithWhite:0 alpha:0.18] CGColor]);
CGContextAddPath(context, outerPath);
CGContextFillPath(context);

//Button

UIColor *buttonColor;
if (self.type == JMenuButtonTypeBlack) {
    buttonColor = [UIColor colorWithWhite:0 alpha:1.0];
}
else if (self.type == JMenuButtonTypeWhite) {
    buttonColor = [UIColor colorWithWhite:0.72 alpha:1.0];
}

CGRect insideRect = rectForRectWithInset(self.bounds, 3);

CGMutablePathRef innerPath = createRoundedRectForRect(insideRect, MENU_BUTTON_INNER_RADIUS);
CGPoint gradientTop = CGPointMake(0, insideRect.origin.y);
CGPoint gradientBottom = CGPointMake(0, insideRect.origin.y + insideRect.size.height);

//Base color
CGContextSaveGState(context);
CGContextSetFillColorWithColor(context, [buttonColor CGColor]);
CGContextAddPath(context, innerPath);
CGContextFillPath(context);
CGContextRestoreGState(context);

//Gradient 1
CGContextSaveGState(context);

CGFloat colors [] = { 
    1.0, 1.0, 1.0, 0.16, 
    0.0, 0.0, 0.0, 0.11
};

CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace, colors, NULL, 2);

CGContextAddPath(context, innerPath);
CGContextClip(context);

CGContextDrawLinearGradient(context, gradient, gradientTop, gradientBottom, 0);
CGGradientRelease(gradient), gradient = NULL;
CGColorSpaceRelease(baseSpace), baseSpace = NULL;

CGContextRestoreGState(context);


//Shadow
CGContextSaveGState(context);
CGContextAddPath(context, innerPath);
CGContextSetShadowWithColor(context, CGSizeMake(0, 2), 3.0, [[UIColor blackColor] CGColor]);
CGContextRestoreGState(context);

这是迄今为止的样子。影子代码没有什么区别:

enter image description here

1 个答案:

答案 0 :(得分:5)

设置阴影后,您没有绘制任何内容。您需要描边或填充(CGContextStrokePath()CGContextFillPath())路径,以便将其绘制到上下文中,从而显示在屏幕上。