3

エンボス効果を作成するために、いくつかのテキストに2つの異なる影を描くことにしました。これが私の最初の影でテキストを描く部分ですdrawInRect(使用されるすべての変数はすでに定義されています):

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

しかし今、私は2番目の影を描くという問題に直面しています。シャドウを変更してテキストを再度描画する必要があると思いますが、テキストのコピーをもう1つ追加せずに変更する必要があります。

テキスト自体を実際に描画せずにテキストを描画するにはどうすればよいですか?塗りつぶしの色をに変更してclearColorも機能しません。私は人々がこれにクリッピングマスクを使用するのを見てきましたが、AFAICTはテキストではなく単純な形状でのみ機能します。

または、同じテキストに2つの影を描く簡単な方法はありますか?

4

1 に答える 1

1

必要な効果に応じて、2つのオプションがあります。

  • 最初の「上部」シャドウがその下の2番目の「下部」シャドウにも寄与するようにする場合は、透明レイヤーを使用します。

    1. CGContextの影を「下の」影に設定します
    2. を使用して透明レイヤーを作成しますCGContextBeginTransparencyLayer
    3. 「上部」シャドウのコンテキストのシャドウを設定します
    4. テキストを描く
    5. を使用して透明レイヤーを終了しますCGContextEndTransparencyLayer

(透明レイヤーは非常に高価になる可能性があることに注意してくださいCGContextBeginTransparencyLayerWithRect。できるだけ小さな長方形を呼び出して渡すのが最善です。)

  • シャドウを独立させたい場合(各シャドウに寄与する唯一のものはテキストです)、トリックを使用する必要があります。

コンテキストの境界の外側にテキストを描画し、シャドウを正しい場所に配置できるように、十分な大きさの大きなオフセットを追加してシャドウを設定します。そうすれば、影だけが表示され、テキストは表示されません。

オフセットが大きいテキストと影

  1. どのオフセットが「十分に大きい」かを把握します。それはおそらく、(ビューに基づいて)描画しているコンテキストのサイズ、およびおそらくテキストの境界に依存します。または、それをごまかしてください:5000ポイントのような途方もなく大きな値を選んでください。
  2. 影を設定します。通常のyオフセットに大きなオフセットを追加します。
  3. 大きなオフセットで垂直方向にオフセットして、テキストを描画します。

「下の」影ごとに、後ろから前に1〜3を繰り返します。その後、オフセットなしでテキストと「最上部」の影を最後に描画します。

于 2013-01-01T21:09:14.773 に答える