(iphone)为图层添加阴影

时间:2011-02-18 07:08:36

标签: iphone shadow drawrect

我想将阴影添加到具有图像层的UIImageView。

我尝试过self.layer.shadowOffset / shadowOpacity路线,但速度太慢..
当我想添加阴影时,我调用addShadowLayerWithOffset方法,我希望调用drawRect并添加阴影..
但是drawRect没有被调用。

我在这里缺少什么?

- (void)drawRect:(CGRect)rect
{
    SYSLOG(LOG_DEBUG, "in drawRect, isShadowed: %d", isShadowed);
    if (isShadowed == true)
    {
        CGContextRef currentContext = UIGraphicsGetCurrentContext();
        CGContextSaveGState(currentContext);
        CGContextSetShadow(currentContext, CGSizeMake(100, 100), 3);
        [super drawRect: rect];
        CGContextRestoreGState(currentContext);
    }
    else
        [super drawRect: rect];
}

- (void) addShadowLayerWithOffset: (int)offset
{
//  self.layer.shadowOffset = CGSizeMake(offset,offset);                                                                                                                                                                                                                      
//  self.layer.shadowOpacity = 0.7f;                                                                                                                                                                                                                                          
//  self.layer.shadowRadius = 5.0;                                                                                                                                                                                                                                            
    isShadowed = true;
    [self setNeedsDisplay];
}
  • EDIT
好吧,我得到了drawLayer。 我需要[self.layer setNeedsDisplay]而不是[self.layer setNeedsPlay]其中self是UIImageView子类。

但阴影没有被绘制,事实上图像(原始图层)本身也没有显示 我应该改变什么?

- (void) drawLayer: (CALayer*) layer inContext: (CGContextRef)context
{
    SYSLOG(LOG_DEBUG, "in drawLayer, isShadowed: %d", isShadowed);
    if(isShadowed == true)
    {
        CGContextSaveGState(context);
        CGContextSetShadow(context, CGSizeMake(10, 10), 3);
        [super drawLayer: layer inContext: context];
        CGContextRestoreGState(context);
    }
    else
        [super drawLayer: layer inContext: context];
}

3 个答案:

答案 0 :(得分:2)

尝试调用此方法:

由UIViewController调用:

[self addShadowedLayer:self.view inRect:( CGRectMake(30, 30, 128, 192))];


- (void)addShadowedLayer:(UIView *)aUIView inRect:(CGRect)aRect {
    CALayer *sublayer = [CALayer layer];
    sublayer.backgroundColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor;
    sublayer.shadowOffset = CGSizeMake(0, 3);
    sublayer.shadowRadius = 5.0;
    sublayer.shadowColor = [UIColor blackColor].CGColor;
    sublayer.shadowOpacity = 0.8;
    sublayer.frame = aRect;
    sublayer.cornerRadius = 26.0;
    [aUIView.layer addSublayer:sublayer];
}

它只是添加一个白色的圆形矩形,但你需要的只是它的影子...

答案 1 :(得分:1)

你正在打电话:

[super drawRect: rect];

但苹果说:

您不应该直接自己调用此方法。要使视图的一部分无效,从而导致重绘该部分,请调用setNeedsDisplay或setNeedsDisplayInRect:方法。

而不是drawRect,曾经尝试过drawLayer?

-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context

答案 2 :(得分:1)

我认为你正在咆哮错误的树。你说直接在图像层上指定阴影太慢了。这是正确的,因为操作系统使用alpha通道来确定绘制阴影的位置。

在iOS 3.2及更高版本中,您可以采取的措施是指定阴影路径。首先创建一个CGPathRef并将其设置为图层的阴影路径。

这样可以大大改善渲染效果,而无需为阴影引入另一层。