2012-09-27 87 views
2

我在drawRect方法我在UIBezierPath添加到显示在一个广场上阴影的UIView和委托方法。更改阴影的颜色上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); 

然后我想改变基于特定标准的阴影的颜色,所以我MAVE一个名为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方法一些花哨的动画。

干杯

回答

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:

你当然会在init*方法来初始化_shadowColor = [UIColor blackColor]

+0

这完美的作品 - 由于负载(如果我能记得的我的旧登录我本来还有代表以给予好评本 - 遗憾的是我已经重新加入让着它给予好评) – Dominic