2012-05-15 289 views
1

我想爲某些形狀創建一個陰影(沒有導致陰影的對象)。例如,對於橢圓形:透明形狀的繪製陰影

CGContextSetShadowWithColor(ctx, offset, blur, color.CGColor); 
CGContextFillEllipseInRect(ctx, drawInRect); 

陰影繪製精細,但我想的形狀是透明的。我試圖設置填充顏色以清除:

CGContextSetFillColorWithColor(ctx, UIColor.clearColor.CGColor); 

這會導致陰影也被抑制。

實現黑色陰影的透明形狀的最簡單方法是什麼?如果我需要做一個面具,我會如何用Quartz做到這一點?

編輯:正如第一個回答者指出的那樣,問題是模棱兩可或混淆。我試圖澄清一點。

回答

3

你想只看到陰影,沒有橢圓?

如果你用Quartz來繪製它,這很棘手,因爲Quartz使用橢圓的外觀來生成陰影。如果您將橢圓剪輯或蒙上,也會影響陰影。

一種可能性是調整陰影的偏移量和橢圓的位置,以使橢圓位於上下文的可見區域之外。例如,如果您正在繪製100 x 100位圖上下文,則可以將橢圓的位置設置爲{normalPosition.x - 100,normalPosition.y},並將shadow的偏移量x增加100。這樣,橢圓會完全脫離語境,但影子會在同一個地方。 (當然,根據需要調整數學運算。)

另一種選擇:如果在CALayer上使用shadowPath屬性,則僅根據該路徑生成陰影,而不是基於圖層內容生成陰影。根據你的情況,這可能比純CG更容易管理。

+0

有趣的東西。我仍然在四處亂逛,但它似乎就像將橢圓剪掉一樣,陰影仍然在畫。當我知道自己在做什麼時,我會回覆;)感謝您的回答。 –

+0

你必須發佈更多的代碼,我不能真正猜出你在做什麼。 –

+0

好的,在上面貼出我的答案。不知道我怎麼知道EO的東西,但它非常好... –

1

您可以使用剪切路徑來做到這一點。 EO的東西有必要定義一個繪製所有東西的外層空間,以及一個內部空間,其中沒有繪製任何東西。

我做了這個稍微複雜一點,因爲之後我會放入一個淺色的紅色圓圈。

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(ctx); // store to ignore the clipping path later 
    float margin = self.bounds.size.width * .1; 
    CGRect ellipseRect = CGRectMake(margin, margin, self.bounds.size.width - 2*margin, self.bounds.size.height - 2*margin); 

    // OUTER path is just the bounds 
    CGMutablePathRef mutablePath = CGPathCreateMutable(); 
    CGPathRef pathRef = CGPathCreateWithRect(self.bounds, NULL); 
    CGPathAddPath(mutablePath, NULL, pathRef); 
    // INNER path is the same as the ellipse 
    CGPathRef pathRef2 = CGPathCreateWithEllipseInRect(ellipseRect, NULL); 
    CGPathAddPath(mutablePath, NULL, pathRef2); 
    CGContextAddPath(ctx, mutablePath); 
    CGContextEOClip(ctx);  

    CGContextSetFillColorWithColor(ctx, UIColor.greenColor.CGColor); 
    CGContextSetShadowWithColor(ctx, CGSizeMake(margin/2.0f, margin/2.0f), 10, UIColor.blackColor.CGColor); 
    CGContextFillEllipseInRect(ctx, ellipseRect); 

    // replace the green circle for a very transparent red one just for fun 
    CGContextRestoreGState(ctx); 
    CGContextSetFillColorWithColor(ctx, [UIColor.redColor colorWithAlphaComponent:.1].CGColor); 
    CGContextSetShadowWithColor(ctx, CGSizeZero, 0, NULL); 
    CGContextFillEllipseInRect(ctx, ellipseRect); 
} 
+1

我明白了,你想要的東西與我想象的不同。一張照片會有所幫助。我以爲你想要一個橢圓形的陰影(整個事物),但是你得到的是一個橢圓形陰影,橢圓形的陰影被切掉了。橢圓周圍還有一些綠色抗鋸齒僞像。 –

+1

嗨Kurt,對不起,我沒有讓問題更清楚。我只是刪除了整個事情,但自從我(和其他人)高聲贊助你之後,這將成爲歷史書籍的一部分:) –

+1

不用擔心,無論是在不同情況下,效果都可能有用。 –