2011-02-18 72 views
0

我想爲具有圖像圖層的UIImageView添加陰影。(iphone)爲圖層添加陰影

我試過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]; 
} 
  • 編輯

好吧,我得到了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]; 
} 

回答

1

您致電:

[super drawRect: rect]; 

但蘋果說:

你永遠不應該直接調用此方法自己。要使視圖的一部分無效,並因此導致該部分被重繪,請改爲調用setNeedsDisplay或setNeedsDisplayInRect:方法。

而不是drawRect,試過drawLayer?

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

我想[super drawRect:rect]很好,因爲[super dealloc]很好。無論如何,drawLayer也不會被調用。我已經設置了我添加到視圖中的圖層的委託。 – eugene 2011-02-18 07:59:08

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

我想你在吠叫錯誤的樹。你說直接在圖像層上指定陰影太慢了。這是正確的,因爲操作系統使用alpha通道來確定在哪裏繪製陰影。

在iOS 3.2及更高版本中改進渲染性能的方法是指定陰影路徑。您首先創建一個CGPathRef並將其設置爲圖層的陰影路徑。

這應該會顯着改善渲染效果,而不需要爲陰影引入另一個圖層。