2012-01-02 4 views
4

テキストを白い枠線で囲んでください。私はテキストのためにCATextLayerを使用しています。 CATextLayerのborderColor/borderWidthプロパティはありません。もちろん、私はそのスーパークラス(CALayer)のプロパティを使うことができますが、テキスト自体の周りではなく、レイヤの枠の周りに境界線を描画します。誰も私がCATextLayerを使ってこれを達成する方法を知っていますか?CATextLayer font borderColor?

enter image description here

+0

何かがこれを行うための唯一の方法は、いずれかのサブクラス 'CATextLayer'にあるか、デリゲートメソッド' drawLayerを使用することを私に言っています:inContext: '実際の描画を自分で行います。 –

+0

ご意見ありがとうございます。実装が難しいようです。ドローイングを自分でやろうと思います... – strave

+0

[低レベルのテキストレンダリング](http://www.codeproject.com/KB/iPhone/Glyph.aspx)でこのページをチェックしてください。最初はかなり大きいですが、時間をかけて処理すれば、何が起こっているのかを知ることができます。 – pe8ter

答えて

5

念のために誰かが私の解決策に興味がある:

は、基本的には直接CoreTextを使用せずにストローク(境界線)を使用してテキストを作成することが可能です。 CATextLayerのstringプロパティはNSAttributedStringsを受け入れます。したがって、その属性にストロークの色とストロークの幅を持つNSAttributedStringを与えることは簡単です。

残念ながら、私はフォントサイズをアニメーション化する必要がありました。文字列プロパティはアニメーション可能ですが、NSStringの場合のみです。そこで私はCATextLayerをサブクラス化することに決めました。多くの試みの後、私はCATextLayerの文字列とコンテンツのプロパティが互いに排他的であることを認識しました。つまり、文字列またはコンテンツのいずれかが表示されます。私は自分自身の文字列の描画を行う方法を把握できませんでした。 displayとdrawInContext:ctxメソッドは、コンテンツが更新されているときにのみ呼び出されますが、文字列を更新するために何を呼び出す必要があるかはわかりませんでした。

私は自分のCATextLayerクラスを作成し、CALayerをサブクラス化することに決めました。私はfontSizeというアニメーション可能なプロパティを作成しました。これがアニメーション化されると、drawInContext:ctxメソッドが呼び出されます。 drawInContext:ctxメソッドでは、CoreTextで新しい文字列を作成し、それに応じてfontSizeプロパティを使用してサイズを更新します。フォントサイズをアニメーションを心配することなく、ソリューションに興味がある人のために

3

@import QuartzCore; 
@import CoreText; 

- (void)addTextLayer 
{ 
    NSDictionary* attributes = @{ NSFontAttributeName : [UIFont boldSystemFontOfSize:40.0], 
           (NSString*)kCTForegroundColorAttributeName: (id)[UIColor blackColor].CGColor, 
           (NSString*)kCTStrokeWidthAttributeName: @(-2.0), 
           (NSString*)kCTStrokeColorAttributeName: (id)[UIColor whiteColor].CGColor }; 
    CATextLayer* textLayer = [CATextLayer layer]; 
    textLayer.string = [[NSAttributedString alloc] initWithString:@"Hello World" attributes:attributes]; 

    // Do the rest... 
}