2013-01-01 31 views
2

我試圖在一些文本上繪製兩個不同的陰影以創建浮雕效果。下面是我的drawInRect,我畫與第一陰影文本的部分(使用的所有變量都已經定義):在文本上繪製兩個陰影(Core Graphics)

CGContextSetShadowWithColor(context, textInnerShadowOffset, textInnerShadowBlurRadius, textInnerShadowColor.CGColor); 
[textColor setFill]; 
[self.text drawInRect:rect withFont:self.font lineBreakMode:self.lineBreakMode alignment:self.textAlignment]; 

但是現在我面臨着繪製第二陰影的問題。我假設我需要改變陰影並再次繪製文本,但是我需要這樣做而不添加文本的其他副本。

如何繪製文字而不真正繪製文字本身?將填充顏色更改爲clearColor不起作用。我已經看到人們使用剪貼蒙版,但AFAICT只適用於簡單的形狀,而不是文字。

或者,是否有更容易的方法在相同的文本上繪製兩個陰影?

回答

0

兩個選項,取決於具體的效果,你想:

  • 如果你想第一個,「上」陰影也有助於第二,「低」的影子在它下面,使用transparency layer

    1. 設置你的CGContext上的陰影,爲「下」影子
    2. 創建使用CGContextBeginTransparencyLayer
    3. 設置上下文的陰影,爲「上」影子
    4. 繪製文本
    5. 結束透明度透明層層使用CGContextEndTransparencyLayer

(請注意,透明圖層可能相當昂貴。這是最好的調用CGContextBeginTransparencyLayerWithRect和儘可能小的矩形傳遞,你可以)

  • 如果你想陰影是獨立的 - 這有助於各陰影的唯一的事情是文本 - 你需要使用技巧。

設置一個額外的大偏移量的陰影,足夠大,以便您可以在您的上下文邊界之外繪製文本,並使陰影位於正確的位置。這樣你只會看到陰影,而不會看到文字。

text and shadow with large offset

  1. 弄清楚什麼偏移量是 「足夠大」。它可能取決於你正在繪製的上下文的大小(基於你的視圖),也可能取決於文本的邊界。或者,只是巧妙地:選擇一個非常大的值,如5000點。
  2. 設置你的影子。將大偏移量添加到其正常的y偏移量。
  3. 繪製文本,垂直偏移大偏移量。

對每個「下」陰影重複1-3,從後到前。之後,繪製文本和最後一個「最上面的」陰影,沒有偏移量。

+0

感謝您的提示!這是一個有用的開始,但第二個陰影的顏色繪製在文本的頂部(請參閱http://i.imgur.com/gn0mv.png中的綠色)。有沒有辦法解決這個問題? – Nathan

+0

我無法確切知道你在做什麼,只是基於截圖 - 哪一種顏色是文本,哪些是兩個陰影?無論如何,我增加了另一種可能的方式來做出答案。 –