我有一个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方法创建阴影的一些奇特动画无效。
干杯
答案 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*
。