2

我有一个 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 方法创建阴影的一些精美动画将无法正常工作。

干杯

4

1 回答 1

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*方法中进行初始化。

于 2012-09-27T23:44:21.167 回答