更改UIBezierPath上阴影的颜色

时间:2012-09-27 23:29:59

标签: objective-c ios cgcontext shadow uibezierpath

我有一个UIVIew的委托方法,在drawRect方法中,我在UIBezierPath中添加一个方块上的阴影。

 //// General Declarations
 CGContextRef context = UIGraphicsGetCurrentContext();

 //// Shadow Declarations
 UIColor* shadow = [UIColor blackColor];
 CGSize shadowOffset = CGSizeMake(0, -0);
 CGFloat shadowBlurRadius = 15;


 //// Rectangle Drawing
 rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(8, 8, 44, 44)];
 CGContextSaveGState(context);
 CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
 [[UIColor whiteColor] setFill];
 [rectanglePath fill];
 CGContextRestoreGState(context);

然后我想根据某些标准更改阴影的颜色,因此我制作了一个名为makeRed的方法。

- (void)makeRed {
  NSLog(@"makeRed");
  CGContextRef context = UIGraphicsGetCurrentContext();
  // Shadow Declarations
  UIColor* shadow = [UIColor redColor];
  CGSize shadowOffset = CGSizeMake(0, -0);
  CGFloat shadowBlurRadius = 15;
  CGContextSaveGState(context);
  CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
  [[UIColor whiteColor] setFill];
  [rectanglePath fill];
  CGContextRestoreGState(context);
}

但是当我调用该方法时,我收到了消息:

:CGContextSaveGState:无效的上下文0x0

任何想法如何设置正确的上下文或以不同的方式更改阴影颜色?

请注意阴影的初始绘制工作完美,因为代理还有其他属性,即使用.layer方法创建阴影的一些奇特动画无效。

干杯

1 个答案:

答案 0 :(得分:2)

UIView文档中,您可以看到drawRect:

  

当调用此方法时,UIKit已为您的视图正确配置了绘图环境,您只需调用渲染内容所需的绘图方法和功能。

因此,您在drawRect:内执行的绘图是正确的,因为绘图上下文设置正确等等,但makeRed方法不是这种情况。

我建议使用ivar shadowColor,然后在drawRect:方法中使用它。 您的makeRed将会是这样的

- (void)makeRed;
{
  self.shadowColor = [UIColor redColor];
  [self setNeedsDisplay];
}

然后将drawRect:中的行修改为

CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, self.shadowColor.CGColor);

setNeedsDisplay用于告诉UIKit您希望重新绘制视图,然后再次调用drawRect:

您当然必须在_shadowColor = [UIColor blackColor]方法中初始化init*