2012-04-15 8 views
1

テクスチャにテキストを描画するのに[NSString drawInRect:]を使用していますが、ドロップシャドウを追加するまでは問題ありません。彼らは正しく表示されますが、私は描いている矩形で切り取られることがよくあります。NSString drawInRect:iOS上に影を落とす

は、CGContextSetShadowWithColor(...)によって適用されるため、ドロップシャドウについてはわかりません。ここで

は、私が使用しているコード(綿毛削除)です:

CGSize dim = [theString sizeWithFont:uifont]; 

... 

CGContextSetRGBFillColor(context, 1.0f, 1.0f, 1.0f, 1.0f); 
CGContextTranslateCTM(context, 0.0f, dim.height); 
CGContextScaleCTM(context, 1.0f, -1.0f); 
CGContextSetShadowWithColor(context, CGSizeMake(dropOffset.x, dropOffset.y), dropBlur, dropColorRef); 

... 

[theString drawInRect:dim withFont:uifont lineBreakMode:UILineBreakModeWordWrap alignment:align]; 

私はドロップシャドウを取り、考慮にあいまいにdimを拡大しようとした、それは主に動作しますが、時には拡大RECT原因追加された余分なスペースのためにラップされる線は完全に異なっています。

私が使用しているよりも描画するのに必要なテクスチャ/矩形のサイズを見つける(または文字列を描く)方が良い方法はありますか?

答えて

2

ちょうど2つの異なる矩形を追跡する必要があります。

  1. -[NSString drawInRect:]に渡すテキストを含む矩形です。このstringBoundsと呼んでください。
  2. 影を含む展開/オフセット矩形。このshadowBoundsと呼んでください。

テクスチャのサイズをshadowBoundsにしてください。

テキストを描画するときは、shadowBounds.origin - stringBounds.originで翻訳する必要があります。 (または逆の場合もありますが、それはあなたが何をしているかによって決まります。取得したらそれを知るでしょう)

次に[theString drawInRect:stringBounds ...]を実行してください。

+0

私は何か間違っているかもしれませんが、 '[theString drawInRect:stringBounds ...]'を実行すると文字列は正しく翻訳されますが、コンテキストが大きくても影が切り取られます。これは、文字列全体(text + shadow)がstringBoundsによってクリップされるようなものです。 –

+1

' - [NSString drawInRect:...]'はクリップしません。私はあなたが間違ってオフセットを取得しているか、またはrect rect sizeが間違っていると思って、あなたの影がビットマップコンテキストの外に出るようにするでしょう。デバッグするには、コンテキスト全体を1つの色で塗りつぶしてから、テキストを描画するのではなく別の色で四角形を塗りつぶします。正しい場所にあるかどうかは明白です。 –

+0

OK、私は最終的に何が私を踏み外しているかを考え出しました。 -5×ドロップシャドウがあるとしましょう。テキストを描画するときは、0はドロップシャドウの左端です。テキストは描画しません。私は、0は常にテキストにリンクされたままであると仮定していましたが、すべてが描画されていればそれが最重要です。 –

関連する問題