22

NSString (UIStringDrawing)iOSが提供するカテゴリメソッドを使用して描画されたテキストにドロップシャドウを追加したいと思います。

- (CGSize)drawAtPoint:(CGPoint)point forWidth:(CGFloat)width 
             withFont:(UIFont *)font minFontSize:(CGFloat)minFontSize 
       actualFontSize:(CGFloat *)actualFontSize 
        lineBreakMode:(UILineBreakMode)lineBreakMode
   baselineAdjustment:(UIBaselineAdjustment)baselineAdjustment; 

明らかに、ドロップシャドウオプションはありません。

はい、ここでUILabelを使用して、ドロップシャドウプロパティを設定することはできますが、UIViewサブクラス(UILabelなど)はCALayerオブジェクトをラップし、(パフォーマンス的に)重くなるため、パフォーマンスは低下します。

コンテキストは次のとおりです。

drawRect:合成されたUIViewサブクラスのNibファイルからテーブルセルを作成する代わりに、テーブルセルビューに実装して、UITableViewCellサブクラスのカスタム描画を行っています。

多数のUIViewサブクラスを合成すると、これを無駄なく維持し、テーブルビューのスクロールパフォーマンスで毎秒50〜60フレーム以内にとどまろうとする目的が無効になります。

少しずらして文字列を2回描いてみました。これは、私が行っているセルの背景色のドロップシャドウの色を微調整すると許容できるようになる可能性がありますが、かなり厄介なようです。確かに、UILabelで得られるようなドロップシャドウブラープロパティはありません。

私は解決策を探しましたが、UILabelの使用法を推奨しています(テーブルセルビューに合成される約12の異なるテキスト要素があるため、上記で却下しました)またはCGContextSetShadow()。後者は常に長方形のコンテキストで提案されているようであり、必ずしもdrawAtPoint...上記のNSStringメソッドで直接描画されたテキストのパスに影を付けるためではありません。(私はそれを試しましたが、うまくいかなかったようです(つまり、何も変更されていません)。コアグラフィックスの描画は初めてです)。

提案?

4

1 に答える 1

40

それは私にとってはうまくいきますCGContextSetShadow()。例:

- (void)drawRect:(CGRect)rect 
{
    NSString *string = @"Hello World!";

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetShadow(context, CGSizeMake(20.0f, 20.0f), 10.0f);

    [string drawAtPoint:CGPointMake(100.0f, 100.0f) withFont:[UIFont boldSystemFontOfSize:36.0f]];
}
于 2010-12-08T14:24:15.530 に答える