2010-12-08 18 views
22

を使用しない方法がNSString (UIStringDrawing)カテゴリの方法を提供:はのdrawRectでNSStringのテキストにドロップシャドウを追加する:私はiOSのを使用して描かれたテキストにドロップシャドウを追加したいUILabel

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

は明らかに、何の低下はありませんシャドウオプション。

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

私はテーブルセルの表示にdrawRect:を実装し、UITableViewCellのサブクラスのために描画の代わりに、合成のUIViewサブクラスのnibファイルから表のセルを作成するカスタムやってる:

はここコンテキストです。

複数のUIViewサブクラスを合成すると、テーブルビューのスクロールのパフォーマンスで、このリーンを維持し、毎秒50-60フレーム以内に留まるという目的を無効にします。

私はわずかなオフセットで2回文字列を描画しようとしました。これは、私が行っているセルの背景色にドロップシャドウの色を微調整すると、これは受け入れられるかもしれませんが、それはむしろかすかなようです。確かに、UILabelで取得するようなドロップシャドウブラーのプロパティはありません。

私は解決策を探して、UILabelの使用を推奨しています(これは、表のセルビューに合成された約12の異なるテキスト要素があるため上記で解消しました)またはCGContextSetShadow()です。後者は、長方形の文脈の中で常に示唆されているようであり、上記のNSString drawAtPoint...メソッドで直接描画されたテキストのパスに影を付けるためのものではありません。 (私はそれを試してみましたが、動作していない(つまり何も変更されていない)、Core Graphicsの新機能です)。

提案?

答えて

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]]; 
} 
+3

優れています。ありがとうOle!以前は、ぼかし値が高すぎてオフセットがわずか(1,1)だったので、それが有効になるのを見ることができませんでした。私がこれを初めて知りましたので、次の図ではシャドウ効果をオフにしました(実際にはQuartz 2Dガイドを体系的に読む必要があります)。しかし、シャドウエフェクトが設定される前に "CGContextSaveGState(context)"を使用して成功し、NSStringが描画を行った後に "CGContextRestoreGState(context)"を成功させました。私はすべて設定されています! – idStar

関連する問題